Ǵárezlilik inekciyası

Programmalıq injiniringde **ǵárezlilik inekciyası** (ingl. *dependency injection*) ‒ bul obyekt yamasa funkciya ózine kerekli basqa obyektlerdi yamasa funkciyalardı ishki dúziwdiń ornına sırttan alatuǵın programmalastırıw usılı. Ǵárezlilikti inekciyalawdıń maqseti - obektlerdi dúziw hám olardı paydalanıw máselelerin bóliw arqalı bos baylanısqan baǵdarlamalardı jaratıw. Bul úlgi belgili bir xızmetti paydalanǵısı keletuǵın obekt yamasa funkciya sol xızmetlerdi qalay dúziw kerekligin biliwi shárt emesligin támiyinleydi. Onıń ornına, qabıllawshı "klient" (obekt yamasa funkciya) ózi bilmeytuǵın sırtqı kod ("inektor") arqalı óziniń ǵárezliliklerin aladı. Ǵárezlilikti inekciyalaw jasırın ǵárezliliklerdi anıq etedi hám tómendegi máselelerdi sheshiwge járdem beredi:

* Klass ózi ǵárezli bolǵan obektlerdiń dúziliwinen qalay ǵárezsiz bola aladı?
* Qollanba hám ol paydalanatuǵın obektler hár qıylı konfiguraciyalardı qalay qollap-quwatlay aladı?

Ǵárezlilikti inekciyalaw kóbinese kodtı ǵárezlilikti inversiyalaw principine sáykes uslap turıw ushın qollanıladı.

Statikalıq tipli tillerde ǵárezlilikti inekciyalawdı qollanıw klienttiń tek paydalanatuǵın xızmetlerdiń interfeyslerin járiyalawın talap etedi, olardıń konkret implementaciyaların emes. Bul qayta kompilyaciya qılmastan orınlanıw waqtında qaysı xızmetlerdiń paydalanılatuǵının ózgertiwdi ańsatlastıradı.

Qollanba freymvorkleri kóbinese ǵárezlilikti inekciyalawdı basqarıwdı inversiyalaw menen birgelikte qollanadı. Basqarıwdı inversiyalaw astında, freymvork dáslep obektti (mısalı, kontrollerdi) dúzedi, sońınan oǵan basqarıw aǵımın ótkeredi. Ǵárezlilikti inekciyalaw menen freymvork qollanba obekti járiyalaǵan ǵárezliliklerdi de instanciyalaydı (kóbinese konstruktor metodınıń parametrlerinde) hám ǵárezliliklerdi obektke ótkeredi.

Ǵárezlilikti inekciyalaw "ǵárezliliklerdiń implementaciyaları ústinen basqarıwdı inversiyalaw" ideyasın ámelge asıradı, sonlıqtan geybir Java freymvorkleri bul koncepciyanı ulıwma túrde "basqarıwdı inversiyalaw" dep ataydı (basqarıw aǵımın inversiyalaw menen aljastırmań).

## Roller

Ózińiz ushın muzlatqıshtan zatlardı alǵanıńızda, máseleler keltirip shıǵarıwıńız múmkin. Esikti ashıq qaldırıwıńız, anańız yaki atańız sizge alıwǵa ruqsat bermegen nárseni alıwıńız múmkin. Hátte bizde joq yaki múddeti ótken nárseni izlep atırǵan bolıwıńız múmkin.

Siz ne islewińiz kerek, bul - qálewińizdi bildiriw, "Túslik waqtında ishiw ushın bir nárse kerek," hám sońınan biz siz awqatlanıwǵa otırǵanıńızda sizde bir nárseniń bolıwın támiyinleymiz.

Ǵárezlilikti inekciyalaw tórt roldi óz ishine aladı: xızmetler, klientler, interfeysler hám inektorlar.

### Xızmetler hám klientler
Xızmet - bul paydalı funkcionallıqqa iye hár qanday klass. Óz gezeginde, klient - bul xızmetlerdi paydalanatuǵın hár qanday klass. Klientke kerek bolǵan xızmetler klienttiń ǵárezlikleri bolıp esaplanadı.

Hár qanday obekt xızmet yaki klient bola aladı; bul atamalar tek obektlerdiń inekciyadaǵı roline baylanıslı. Bir obekttiń ózi hám klient (ol inekciyalanǵan xızmetlerdi paydalanadı), hám xızmet (ol basqa obektlerge inekciyalanadı) bola aladı. Inekciya waqtında xızmet klienttiń halatınıń bir bólegi bolıp, paydalanıwǵa tayar boladı.

### Interfeysler
Klientler ózleriniń ǵárezlikleriniń qalay ámelge asırılǵanın biliwi shárt emes, tek olardıń atamaları hám API-ın bilse jetkilikli. Mısalı, elektron xatlardı alıp beretuǵın xızmet, perdeniń artında IMAP yaki POP3 protokolların paydalanıwı múmkin, biraq bul detal tek elektron xattı alıwdı qáleytuǵın shaqırıwshı kod ushın áhmiyetsiz bolıwı múmkin. Implementaciya detalların esapqa almaw arqalı, klientler ózleriniń ǵárezlikleri ózgergende ózgeriwi kerek emes.

### Inektorlar
Inektor, geyde assembler, konteyner, provayder yaki fabrika dep te ataladı, xızmetlerdi klientke tanıstıradı.

Inektorlardıń roli - quramalı obekt grafiklerin qurıw hám baylanıstırıw, bunda obektler hám klient, hám xızmet bola aladı. Inektordıń ózi birge isleytuǵın kóp obektlerden ibarat bolıwı múmkin, biraq klient bolmawı kerek, sebebi bul ciklli ǵárezlikti payda etedi.

Ǵárezlilikti inekciyalaw obektlerdiń qalay dúzilgenin olardıń qalay paydalanılatuǵınınan ajıratqanı ushın, ol kóbinese obektke baǵdarlanǵan tillerdiń kópshiliginde ushırasatuǵın new gilt sóziniń áhmiyetin tómenletedi. Freymvork xızmetlerdi jaratıwdı basqarǵanı ushın, baǵdarlamashı tek baǵdarlamanıń domeninde (mısalı, biznes qollanbada Xızmetker obekti yaki satıp alıw qollanbasında Buyırtpa obekti) entitetlerdi kórsetetuǵın mánis obektlerin tikkeley dúziwge beyim boladı.

### Uqsaslıq
Uqsaslıq retinde, avtomobillerdi adamlardı bir jerden ekinshi jerge tasıw boyınsha paydalı jumıs atqaratuǵın xızmetler dep qarawǵa boladı. Avtomobil dvigatelleri benzin, dizel yaki elektr energiyasın talap etiwi múmkin, biraq bul detallar klient - transport basqarıwshı ushın áhmiyetsiz, ol tek ózin mánzilge jetkere alatuǵının ǵana biliwi kerek.

Avtomobiller ózleriniń pedalları, rul dóńgelekleri hám basqa da basqarıw elementleri arqalı birdey interfeysti usınadı. Sonlıqtan, zavodta olarǵa qanday dvigatel "inekciya qılınǵanı" áhmiyetsiz bolıp qaladı hám transport basqarıwshılar kerek bolǵan jaǵdayda hár qanday avtomobilge ótiwi múmkin.

## Artıqmashılıqları hám kemshilikleri

### Artıqmashılıqları
Ǵárezlilikti inekciyalawdıń tiykarǵı paydası klasslar hám olardıń ǵárezlikleri arasındaǵı baylanıstıń kemeyiwi bolıp tabıladı.

Klienttiń óz ǵárezlikleriniń qalay ámelge asırılǵanı haqqındaǵı bilimin alıp taslaw arqalı baǵdarlamalar kóbirek qayta qollanılatuǵın, testlenetuǵın hám saqlanatuǵın boladı.

Bul sonday-aq iykemliliktiń artıwına alıp keledi: klient klient kútetuǵın ishki interfeysti qollaytuǵın hár qanday nárse menen islese aladı.

Ulıwma alǵanda, ǵárezlilikti inekciyalaw standart kodtı azaytadı, sebebi barlıq ǵárezliklerdi jaratıw bir komponent tárepinen basqarıladı.

Aqırında, ǵárezlilikti inekciyalaw parallel rawajlanıwǵa múmkinshilik beredi. Eki baǵdarlamashı bir-birin qollanatuǵın klasslerdi ǵárezsiz rawajlandıra aladı, bul waqıtta olar tek klassler baylanısatuǵın interfeysti biliwi kerek. Plaginler kóbinese úshinshi tárepler tárepinen rawajlandırıladı, olar dáslepki ónimniń baǵdarlamashıları menen hesh qashan sóylespeydi.

#### Testlew
Ǵárezlilikti inekciyalawdıń kóp artıqmashlıqları ásirese birlik-testlewge tiyisli.

Mısalı, ǵárezlilikti inekciyalaw sistemanıń konfiguraciya maǵlıwmatların konfiguraciya fayllarına shıǵarıw ushın qollanılıwı múmkin, bul sistemanı qayta kompilyaciya qılmastan qayta konfiguraciyalawǵa múmkinshilik beredi. Komponentlerdiń hár qıylı implementaciyaların talap etetuǵın hár qıylı jaǵdaylar ushın ayırım konfiguraciyalar jazılıwı múmkin.

Usıǵan uqsas, ǵárezlilikti inekciyalaw kod minez-qulqında hesh qanday ózgeris talap etpegenlikten, onı refaktoring sıpatında eski kodqa qollanıwǵa boladı. Bul klientlerdi kóbirek ǵárezsiz etedi hám olardı test astında bolmaǵan basqa obektlerdi simulyaciya qılatuǵın stubler yamasa maket obektlerin qollanıp, izolyaciyalanǵan túrde birlik-testlewdi anaǵurlım ańsatlastıradı.

Testlewdiń bul jeńilligi kóbinese ǵárezlilikti inekciyalawdı qollanǵanda bayqalatuǵın birinshi artıqmashlıq bolıp tabıladı.

### Kemshilikleri
Ǵárezlilikti inekciyalawdıń sınshıları onıń tómendegishe kemshilikleri bar dep pikir bildiredi:

* Anıq únsiz mánisler bar bolǵan jaǵdayda, konfiguraciya maǵlıwmatların talap etetuǵın klientlerdi jaratadı, bul awır bolıwı múmkin.
* Minez-qulıqtı qurılıstan ajıratqanı sebepli, kodtı izlewdi qıyınlastıradı.
* Ádette refleksiya yamasa dinamikalıq programmalastırıw arqalı ámelge asırıladı, bul IDE avtomatizaciyasına kesent etedi.
* Ádette dáslepki rawajlandırıw basqıshında kóbirek kúsh-jigerdi talap etedi.
* Freymvorkke ǵárezlilikti xoshametleydi.

## Ǵárezlilikti inekciyalaw túrleri
Klienttiń inekciyalanǵan xızmetlerdi alıwınıń bir neshe usılları bar:

* Konstruktor inekciyası, bunda ǵárezlikler klienttiń klass konstruktorı arqalı beriledi.
* Metod inekciyası, bunda ǵárezlikler belgili bir funkcionallıq ushın kerek bolǵanda ǵana metodqa beriledi.
* Setter inekciyası, bunda klient ǵárezlikti qabıl etetuǵın setter metodın ashıp beredi.
* Interfeys inekciyası, bunda ǵárezliktiń interfeysi inektor metodın usınadı, ol ózine berilgen hár qanday klientke ǵárezlikti inekciyalaydı.

Ayırım freymvorklarda klientler ǵárezlilikti inekciyalawdı aktiv túrde qabıl etiwi kerek emes. Mısalı, Java tilinde refleksiya jeke atributlardı testlew waqtında ashıq etip, xızmetlerdi tikkeley inekciyalay aladı.

### Ǵárezlilikti inekciyalawsız
Tómendegi Java mısalında, `Client` klassı konstruktorda inicializaciya qılınǵan `Service` aǵza ózgeriwshisin óz ishine aladı. Klient qaysı xızmetti paydalanatuǵının tuwrıdan-tuwrı quradı hám basqaradı, bul qattı kodlanǵan ǵárezlikti jaratadı.
```java
public class Client {
 private Service service;

 Client() {
 // Ǵárezlilik qattı kodlanǵan.
 this.service = new ExampleService();
 }
}
```


### Konstruktor inekciyası
Ǵárezlilikti inekciyalawdıń eń keń tarqalǵan forması - klasstıń óz ǵárezliklerin konstruktorı arqalı sorawı. Bul klienttiń bárqulla jaramlı halatta bolıwın támiyinleydi, sebebi ol zárúr ǵárezliklersiz instanciyalanbaydı.
```java
public class Client {
 private Service service;

 // Ǵárezlilik konstruktor arqalı inekciyalanadı.
 Client(final Service service) {
 if (service == null) {
 throw new IllegalArgumentException("service nul bolmawı kerek");
 }
 this.service = service;
 }
}
```


### Metod inekciyası
Ǵárezlikler belgili bir metodqa argumentler sıpatında beriledi, olardı tek sol metodtıń orınlanıwı dawamında paydalanıwǵa múmkinshilik beredi, uzaq múddetli sіlteme saqlamay. Bul kózqaras ásirese waqıtsha ǵárezlikler ushın yaki hár qıylı metod shaqırıwları ushın túrli implementaciyalar kerek bolǵanda paydalı.
```java
public class Client {
 public void performAction(Service service) {
 if (service == null) {
 throw new IllegalArgumentException("service nul bolmawı kerek");
 }
 service.execute();
 }
}
```


### Setter inekciyası
Ǵárezliklerdi konstruktor ornına setter metodı arqalı qabıl etiw arqalı, klientler inektorlarǵa óz ǵárezliklerin qálegen waqıtta basqarıwǵa múmkinshilik beredi. Bul qolaylılıq beredi, biraq klient paydalanılmastan burın barlıq ǵárezliklerdiń inekciyalanǵanın hám jaramlı ekenin tekseriwdi qıyınlastıradı.
```java
public class Client {
 private Service service;

 // Ǵárezlilik setter metodı arqalı inekciyalanadı.
 public void setService(final Service service) {
 if (service == null) {
 throw new IllegalArgumentException("service nul bolmawı kerek");
 }
 this.service = service;
 }
}
```


## Derekler

__BÖLİDİMÖNDEMEW__