Kontentke ótiw

Ǵárezlilik inekciyası

Wikipedia — erkin enciklopediya
A diagram of an archetypical dependency injection container for the .NET platform.
Ǵárezlilik inekciyası kóbinese programma qurılısın jeńillestiriw ushın "konteynerler" dep atalatuǵın arnawlı freymvorkler menen birge qollanıladı.
PetManager PetController-ge inekciyalanadı, al PetRepository PetManager-ge inekciyalanadı.

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.[1] 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ı.[2] Ǵárezlilikti inekciyalaw jasırın ǵárezliliklerdi anıq etedi hám tómendegi máselelerdi sheshiwge járdem beredi:[3]

  • 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ı.[4][5]

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.[6]

Ǵá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ń).[7]

Roller

'''Bes jasar balalar ushın ǵárezlilikti inekciyalaw'''

Ó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ı.[8]

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ı.[9][10][11][12]

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ı.[13][14]

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ı.[15]

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ı.[16]

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.[17]

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.[18]

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ı.[19]

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.[20]
  • Ádette dáslepki rawajlandırıw basqıshında kóbirek kúsh-jigerdi talap etedi.[21]
  • Freymvorkke ǵárezlilikti xoshametleydi.[22][23][24]

Ǵárezlilikti inekciyalaw túrleri

Klienttiń inekciyalanǵan xızmetlerdi alıwınıń bir neshe usılları bar:[25]

  • 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ı.[26]

Ǵá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ı.

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ı.

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ı.

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ı.

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

  1. Seemann. «Dependency Injection is Loose Coupling». blog.ploeh.dk. Qaraldı: 28-iyul 2015-jıl.
  2. «HollywoodPrinciple». c2.com. Qaraldı: 19-iyul 2015-jıl.
  3. «The Dependency Injection design pattern – Problem, Solution, and Applicability». w3sDesign.com. Qaraldı: 12-avgust 2017-jıl.
  4. Erez. «Dependency Inversion vs. Dependency Injection» (en). Medium (9-mart 2022-jıl). Qaraldı: 6-dekabr 2022-jıl.
  5. Mathews. «You are Simply Injecting a Dependency, Thinking that You are Following the Dependency Inversion...» (en). Medium (25-mart 2021-jıl). Qaraldı: 6-dekabr 2022-jıl.
  6. «Spring IoC Container» (en). Qaraldı: 23-may 2023-jıl.
  7. Fowler. «Inversion of Control Containers and the Dependency Injection pattern». MartinFowler.com. Qaraldı: 4-iyun 2023-jıl.
  8. I.T. «James Shore: Dependency Injection Demystified». www.jamesshore.com. Qaraldı: 18-iyul 2015-jıl.
  9. «To "new" or not to "new"...». 13-may 2020-jılda túp nusqadan arxivlendi. Qaraldı: 18-iyul 2015-jıl.
  10. «How to write testable code». www.loosecouplings.com. Qaraldı: 18-iyul 2015-jıl.
  11. «Writing Clean, Testable Code». www.ethanresnick.com. Qaraldı: 18-iyul 2015-jıl.
  12. Sironi. «When to inject: the distinction between newables and injectables - Invisible to the eye». www.giorgiosironi.com. Qaraldı: 18-iyul 2015-jıl.
  13. «the urban canuk, eh: On Dependency Injection and Violating Encapsulation Concerns». www.bryancook.net. Qaraldı: 18-iyul 2015-jıl.
  14. «The Dependency Injection Design Pattern». msdn.microsoft.com. Qaraldı: 18-iyul 2015-jıl.
  15. «The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 330». jcp.org. Qaraldı: 18-iyul 2015-jıl.
  16. «3.1. Dependency injection — Python 3: from None to Machine Learning». 8-fevral 2020-jılda túp nusqadan arxivlendi.
  17. «How Dependency Injection (DI) Works in Spring Java Application Development - DZone Java».
  18. «Dependency injection and inversion of control in Python — Dependency Injector 4.36.2 documentation».
  19. «How to Refactor for Dependency Injection, Part 3: Larger Applications».
  20. «A quick intro to Dependency Injection: What it is, and when to use it» (18-oktyabr 2018-jıl).
  21. «Dependency Injection |Professionalqa.com».
  22. «What are the downsides to using Dependency Injection?». stackoverflow.com. Qaraldı: 18-iyul 2015-jıl.
  23. «Dependency Injection Inversion – Clean Coder». sites.google.com. Qaraldı: 18-iyul 2015-jıl.
  24. «Decoupling Your Application From Your Dependency Injection Framework». InfoQ. Qaraldı: 18-iyul 2015-jıl.
  25. Martin Fowler. «Inversion of Control Containers and the Dependency Injection pattern – Forms of Dependency Injection». Martinfowler.com (23-yanvar 2004-jıl). Qaraldı: 22-mart 2014-jıl.
  26. «AccessibleObject (Java Platform SE 7)». docs.oracle.com. Qaraldı: 18-iyul 2015-jıl.