Basqarıwdı inversiyalaw

Programmalıq injiniringde **basqarıwdı inversiyalaw** **(IoC)** – bul kompyuter baǵdarlamasınıń arnawlı jazılǵan bólimleri sırtqı derekten (mısalı, freymvorktan) basqarıw aǵımın alatuǵın proektlestiriw principi. "Inversiya" termini tariyxıy: bul proekt penen baǵdarlamalıq támiynat arxitekturası proceduralıq programmalastırıw menen salıstırǵanda basqarıwdı "inversiyalaydı". Proceduralıq programmalastırıwda baǵdarlamanıń arnawlı kodı ulıwma wazıypalarǵa qaraw ushın qayta qollanılatuǵın kitapxanalardı shaqıradı, biraq basqarıwdı inversiyalaw menen basqarıwdaǵı sırtqı kod yamasa freymvork bolıp, arnawlı kodtı shaqıradı.

IBasqarıwdı inversiyalaw GUI ortalıqları payda bolǵannan berli qosımshalardı islep shıǵarıw freymvorkları tárepinen keńnen qollanıladı hám GUI ortalıqlarında hám veb-server qosımsha freymvorklarında qollanılıwın dawam ettirmekte. Basqarıwdı inversiyalaw freymvorktı qosımsha baǵdarlamashısı tárepinen anıqlanǵan usıllar arqalı keńeytiletuǵın etedi.

Waqıyaǵa tiykarlanǵan programmalastırıw kóbinese IoC arqalı ámelge asırıladı, sonıń ushın arnawlı kod tek ǵana waqıyalardı islew menen shuǵıllanıwı kerek, al waqıyalar/xabarlardıń waqıya ciklı hám jiberiwi freymvork yamasa orınlaw ortalıǵı tárepinen basqarıladı. Veb-server qosımsha freymvorklarında jiberiw ádette marshrutlaw dep ataladı hám basqarıwshılar sońǵı noqatlar dep atalıwı múmkin.

## Alternativ mánisi
"Basqarıwdı inversiyalaw" sóz dizbegi Java baǵdarlamashıları jámiyetinde, atap aytqanda Spring Framework sıyaqlı Java freymvorklarında "IoC konteynerleri" menen qáliplesetuǵın gárezlilik inekciyası (olarǵa kerek obektlerge xızmetlerdi jiberiw) úlgilerin bildiriw ushın ayırım túrde de qollanıla basladı. Bul basqa mániste "basqarıwdı inversiyalaw" freymvorkqa qosımsha obektleri tárepinen qollanılatuǵın gárezliliklerdiń ámelge asırılıwı ústinen basqarıwdı beriwdi bildiredi, freymvorkqa basqarıw aǵımın beriwdiń dáslepki mánisine qaraǵanda (qosımsha kodtıń orınlanıw waqıtı ústinen basqarıw, mısalı, qayta shaqırıwlar).

## Sholıw
Mısal retinde, dástúrli programmalastırıw menen qosımshanıń tiykarǵı funkciyası bar bolǵan buyrıqlar dizimin kórsetiw hám paydalanıwshıdan birewin tańlawdı soraw ushın menyu kitapxanasına funkciya shaqırıwların islewi múmkin. Solay etip, kitapxana funkciya shaqırıwınıń mánisi sıpatında tańlanǵan opciyanı qaytaradı hám tiykarǵı funkciya baylanıslı buyrıqtı orınlaw ushın bul mánisti qollanadı. Bul stil tekstke tiykarlanǵan interfeyslerde keń tarqalǵan edi. Mısalı, elektron pochta klienti jańa pochtanı júklew, aǵımdaǵı pochtaǵa juwap beriw, jańa pochta jaratıw hám t.b. buyrıqları menen ekrandı kórsetiwi múmkin hám paydalanıwshı buyrıqtı tańlaw ushın klavishanı basqansha baǵdarlamanıń orınlanıwı toqtatıladı.

Ekinshi jaǵınan, basqarıwdı inversiyalaw menen baǵdarlama ayna sistemaları, menyular, tıshqanshanı basqarıw hám qurallar panelleri sıyaqlı ulıwma minez-qulıq hám grafikalıq elementlerdi biletuǵın baǵdarlamalıq támiynat freymvorkın qollanıp jazıladı. Arnawlı kod freymvork ushın "boslıqlardı toltıradı", mısalı, menyu elementleri kestesin támiynlew hám hárbir element ushın kod úles programmasın dizimge alıw sıyaqlı, biraq paydalanıwshınıń háreketlerin baqlap, menyu elementi tańlanǵanda úles programmanı shaqıratuǵın freymvork bolıp tabıladı. Pochta klienti mısalında freymvork klaviatura hám tıshqansha kirgiziwlerine ekiwine de erise aladı hám paydalanıwshı tárepinen eki usıl arqalı da shaqırılǵan buyrıqtı shaqıra aladı hám sonday-aq jańa xabarlar kelip túskenin biliw ushın tarmaq interfeysin baqlay aladı hám qanday da bir tarmaq háreketi anıqlanǵanda ekrandı jańarta aladı. Sol freymvork elektron keste baǵdarlaması yaki tekst redaktorı ushın dene sıpatında qollanılıwı múmkin. Kerisinshe, freymvork Veb-brauzerler, elektron keste yaki tekst redaktorları haqqında hesh nárse bilmeydi; olardıń funkcionallıǵın ámelge asırıw arnawlı kodtı talap etedi.

Basqarıwdı inversiyalaw qayta qollanılatuǵın kod hám máselege tán kod qosımshada birge islese de, óz aldına islep shıǵarılatuǵını haqqında kúshli mánisti alıp júredi. Qayta shaqırıwlar, jobalawshılar, waqıya ciklları hám shablon usılı obektke baǵdarlanǵan programmalastırıw kontekstinde termin keńnen qollanılsa da, basqarıwdı inversiyalaw principine ámel etetuǵın proektlestiriw úlgileriniń mısalları bolıp tabıladı. (Ǵárezlilik inekciyası Java freymvorkları tárepinen keń tarqalǵan "ǵárezliliklerdiń ámelge asırılıwı ústinen basqarıwdı inversiyalaw" ayırım, arnawlı ideyasınıń mısalı bolıp tabıladı.)

Basqarıwdı inversiyalaw geyde "Gollivud principi: Bizdi shaqırmań, biz sizdi shaqıramız" dep ataladı, freymvorklardıń orınlaw aǵımın qalay belgileytuǵının kórsetedi.

## Alǵı sóz
Basqarıwdı inversiyalaw kompyuter iliminde jańa termin emes. Martin Fauler sóz dizbeginiń etimologiyasın 1988-jılǵa deyin izleydi, biraq ol 1970-jıllarda Maykl Djekson tárepinen óziniń Djekson Strukturalıq Programmalastırıw metodologiyasında táriyiplengen **baǵdarlama inversiyası** koncepciyası menen tıǵız baylanıslı. Tómennen-joqarıǵa talqılawshı joqarıdan-tómenge talqılawshınıń inversiyası retinde kóriniwi múmkin: bir jaǵdayda basqarıw talqılawshıda bolsa, ekinshi jaǵdayda ol qabıllawshı qosımshada boladı.

Termin Maykl Mattson tárepinen teziste qollanılǵan (freymvorktıń kersinshe ornına qosımsha kodın shaqıratuǵın onıń dáslepki mánisi menen) hám keyinnen Stefano Maccokki tárepinen alınǵan hám 1999-jılı Apache Baǵdarlamalıq Támiynat Fondınıń joq bolǵan joybarı Avalon-da ol tárepinen keń tarqalǵan, onda ol orınlaw aǵımın basqarıwdan tıs bala obekt ǵárezliklerin jiberetuǵın ata-ana obektti bildirgen. Sóz dizbegi 2004-jılı Robert S. Martin hám Martin Fauler tárepinen jáne de keń tarqalǵan, sońǵı terminniń kelip shıǵıwın 1980-jıllarǵa deyin izleydi.

## Táriyiplew
Dástúrli programmalastırıwda biznes logikasınıń aǵımı bir-birine statikalıq baylanısqan obektler tárepinen anıqlanadı. Basqarıwdı inversiyalaw menen aǵım baǵdarlamanıń orınlanıwı waqtında qurılǵan obekt grafigine baylanıslı. Bunday dinamikalıq aǵım abstrakciyalar arqalı anıqlanǵan obekt óz-ara tásirleri arqalı múmkin boladı. Bul orınlaw waqıtı baylanısı gárezlilik inekciyası yaki xızmet lokatorı sıyaqlı mexanizmler arqalı ámelge asırıladı. IoC-de kod kompilyaciya waqtında statikalıq baylanısıwı da múmkin, biraq kodtıń ózinde tikkeley silteme ornına sırtqı konfiguraciyadan onıń táriypin oqıw arqalı orınlaw ushın kodtı tabıw.

Ǵárezlilik inekciyasında ǵárezli obekt yaki modul orınlaw waqtında oǵan kerek obektke baylanısqan. Baǵdarlamanıń orınlanıwı waqtında ǵárezlilikti qanaatlandıratuǵın arnawlı obekt, ádette, statikalıq tallaw arqalı kompilyaciya waqtında belgili bolmaydı. Bul jerde obekt óz-ara tásiri terminlerinde táriyiplengen menen, princip obektke baǵdarlanǵan programmalastırıwdan tıs basqa programmalastırıw metodologiyalarına da qollanılıwı múmkin.

Islep turǵan baǵdarlama obektlerdi bir-birine baylanıstırıwı ushın obektler úylesimli interfeyslerge iye bolıwı kerek. Mısalı, A klassı V klası arqalı ámelge asırılatuǵın I interfeysine minez-qulıqtı delegaciyalawı múmkin; baǵdarlama A hám V-nı instanciyalaydı, sońınan V-nı A-ǵa inekciyalaydı.

## Qollanılıwı

* XDE ushın Mesa programmalastırıw ortalıǵı, 1985.
* Visual Basic (klassikalıq), 1991.
* HTML DOM waqıyası
* Spring Framework
* ASP.NET Core
* Shablon usılı úlgisi

## Kod mısalı

### HTML DOM waqıyaları
Veb-brauzerler HTML-de DOM waqıyaları ushın basqarıwdı inversiyalawdı ámelge asıradı. Qosımsha islep shıǵarıwshısı qayta shaqırıwdı dizimge alıw ushın document.addEventListener() funkciyasın qollanadı.
```html
<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>DOM Level 2</title>
</head>
<body>
 <h1>DOM Level 2 Waqıya islewshisi</h1> 
 <p><large><span id="output"></span></large></p>

 <script>
 var registeredListener = function () {
 document.getElementById("output").innerHTML = "<large>Dizimge alınǵan tıńlawshı shaqırıldı.</large>";
 } 
 document.addEventListener(
 "click", registeredListener, true
 );

 document.getElementById("output").innerHTML = "<large>Waqıya islewshisi dizimge alındı. Eger siz betti bassańız, siziń veb-brauzerińiz waqıya islewshisin shaqıradı.</large>"

 </script>
</body>
</html>
```


### Veb-qosımsha freymvorkları
ASP.NET Core veb-qosımshası ushın bul mısal kodı veb-qosımsha xostın jaratadı, sońǵı noqattı dizimge aladı, sońınan basqarıwdı freymvorkqa beredi:
```csharp
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Salem Dúnya!");
app.Run();
```


## Derekler

__BÖLİDİMÖNDEMEW__