Кіріспе
Бағдарламалық жасақтама бағдарламалау техникасы
Бағдарламалық инженерияда тәуелділік инъекциясы – объектінің немесе функцияның өзіне қажетті басқа объектілерді немесе функцияларды ішкі түрде жасаудың орнына алатын бағдарламалау техникасы. Тәуелділік инъекциясы объектілерді құру және оларды пайдалану мәселелерін бөлектеуге бағытталған, нәтижесінде байланысы аз бағдарламалар пайда болады. Бұл үлгі, белгілі бір қызметті пайдаланғысы келетін объектінің немесе функцияның осы қызметтерді қалай құру керектігін білуін қажет етпейді. Оның орнына, қабылдаушы "клиентке" (объектіге немесе функцияға) оның тәуелділіктерін сыртқы код (инжектор) арқылы береді, ол туралы клиент білмейді. Тәуелділік инъекциясы жасырын тәуелділіктерді ашыққа шығарады және келесі мәселелерді шешуге көмектеседі: Сынып өзіне байланысты объектілерді құрудан қалай тәуелсіз бола алады? Қолданба және оның пайдаланатын объектілері қалай әртүрлі конфигурацияларды қолдай алады? Тәуелділік инъекциясы көбінесе кодты тәуелділік инверсия принципімен сәйкес етуіне көмектеседі. Статикалық типтегі тілдерде тәуелділік инъекциясын пайдалану, клиенттің тек өзі пайдаланатын қызметтердің интерфейстерін жариялауы керек екенін білдіреді, олардың нақты іске асырылуларын емес, бұл орындалу кезінде қызметтерді қайта құрастырусыз өзгертуді жеңілдетеді. Қолданбалық фреймворктер көбінесе тәуелділік инъекциясын басқаруды кері айналдырумен біріктіреді. Басқаруды кері айналдыру кезінде, фреймворк алдымен объектіні (мысалы, контроллерді) құрастырады, содан кейін оған басқару ағынын жібереді. Тәуелділік инъекциясымен фреймворк сондай-ақ қосымша объектісі жариялаған тәуелділіктерді (көбінесе конструктор әдісінің параметрлерінде) инстанциялайды және тәуелділіктерді объектіге жібереді. Тәуелділік инъекциясы «тәуелділіктердің іске асырылуын басқаруды кері айналдыру» идеясын іске асырады, сондықтан кейбір Java фреймворктері осы тұжырымдаманы «бақылауды кері айналдыру» деп атайды (бақылау ағынының кері айналдырылуымен шатастырмау керек).
How can a class be independent from the creation of the objects it depends on? How can an application, and the objects it uses support different configurations? Dependency injection is often used to keep code in line with the dependency inversion principle. In statically typed languages using dependency injection means a client only needs to declare the interfaces of the services it uses, rather than their concrete implementations, making it easier to change which services are used at runtime without recompiling. Application frameworks often combine dependency injection with inversion of control. Under inversion of control, the framework first constructs an object (such as a controller), and then passes control flow to it. With dependency injection, the framework also instantiates the dependencies declared by the application object (often in the constructor method's parameters), and passes the dependencies into the object. Dependency injection implements the idea of "inverting control over the implementations of dependencies," which is why certain Java frameworks generically name the concept "inversion of control" (not to be confused with inversion of control flow).
Рөлдер
Тәуелділік инъекциясы төрт рольді қамтиды: қызметтер, клиенттер, интерфейстер және инъекторлар.
Қызметтер мен клиенттер
Қызмет – пайдалы функционалдыққа ие кез келген сынып. Ал клиент – қызметтерді пайдаланатын кез келген сынып. Клиентке қажетті қызметтер – клиенттің тәуелділіктері. Кез келген нысан қызмет немесе клиент бола алады; атаулар нысандардың инъекцияда атқаратын рөлімен ғана байланысты. Бір нысан тіпті клиент (инъекцияланған қызметтерді пайдаланады) және қызмет (басқа нысандарға инъекцияланады) бола алады. Инъекция жасалған кезде қызмет клиенттің күйінің бір бөлігіне айналып, пайдалануға қолжетімді болады.
Интерфейстер
Клиенттер өз тәуелділіктерінің қалай іске асырылғанын білмеуі керек, тек олардың аттары мен API-ін білуі жеткілікті. Мысалы, электрондық поштаны алуға арналған қызмет, ішкі жүйеде IMAP немесе POP3 протоколдарын қолдануы мүмкін, бірақ бұл мәліметтерді тек электрондық пошта алуды қалайтын кодқа білудің қажеті жоқ. Іске асыру егжей-тегжейлерін назарға алмау арқасында, клиенттер өз тәуелділіктері өзгерген кезде өздері де өзгеруге қатыспайды.
Инжекторлар
Инжектор, кейде құрастырушы, контейнер, жеткізуші немесе фабрика деп те аталады, клиентке қызметтерді енгізеді. Инжекторлардың міндеті – күрделі объектілер графиктерін құру және байланыстыру, онда объектілер клиенттер де, қызметтер де бола алады. Инжектордың өзі бірлесіп жұмыс істейтін көптеген объектілерден тұруы мүмкін, бірақ ол клиент болмауы керек, себебі бұл айналма тәуелділікке алып келеді. Тәуелділік инъекциясы объектілердің қалай құрылатынын және қалай қолданылатынын бөліп көрсетеді, сондықтан ол көптеген нысанға бағытталған тілдерде кездесетін "жаңа" кілт сөздің маңыздылығын азайтады. Фреймворк қызметтерді құруды өзі қолға алғандықтан, бағдарламашы көбінесе бағдарлама доменіндегі ұғымдарды бейнелейтін құндылық объектілерін ғана тікелей құрастыруға бейім (мысалы, бизнес-қосымшадағы Қызметкер объектісі немесе сауда қосымшасындағы Тапсырыс объектісі).
Салыстырмалылық
Автомобильдерді адамдарды бір жерден екінші жерге тасымалдаудың пайдалы жұмысын атқаратын қызметтер деп қарастыруға болады. Автомобиль қозғалтқыштары газ, дизель немесе электр энергиясын қажет етуі мүмкін, бірақ бұл клиент – жүргізуші үшін маңызды емес, оған тек көлік оны мақсатына жеткізе алатыны ғана маңызды. Автомобильдер педальдар, руль және басқа да басқару құралдары арқылы бірыңғай интерфейс ұсынады. Осылайша, қозғалтқыш зауытта қандай болғаны маңызды емес, және жүргізушілер қажет болған жағдайда кез келген автомобильге көше алады.
Артықшылықтар
Тәуелділік инъекциясының негізгі артықшылығы – сыныптар мен олардың тәуелділіктері арасындағы байланыстың төмендеуі. Клиенттің өзінің тәуелділіктері қалай жүзеге асырылғаны туралы білімінен айырылуы арқасында бағдарламалар қайта пайдалануға, сынауға және қолдауға ыңғайлы болады. Бұл сондай-ақ икемділікті арттырады: клиент, клиент күтетін негізгі интерфейсті қолдайтын кез келген нәрсемен өзара әрекеттесе алады. Жалпы айтқанда, тәуелділік инъекциясы стандартты кодты азайтады, себебі барлық тәуелділіктерді жасау бір компонентпен жүзеге асырылады.
Сынау
Тәуелділік инъекциясының көптеген артықшылықтары бірлік тестілеуге ерекше қатысты. Мысалы, тәуелділік инъекциясын жүйенің конфигурациялық деректерін конфигурациялық файлдарға шығару үшін пайдалануға болады, бұл жүйені қайта құрастырусыз қайта конфигурациялауға мүмкіндік береді. Әртүрлі компоненттерді жүзеге асыруды қажет ететін әртүрлі жағдайлар үшін жеке конфигурациялар жасауға болады. Сонымен қатар, тәуелділік инъекциясы кодтың әрекетін өзгертуді талап етпейтіндіктен, оны ескі кодты жаңарту ретінде қолдануға болады. Бұл клиенттерді тәуелсіз етеді және оларды бөлек бірліктерге сынауды жеңілдетеді, сыналып жатқан емес басқа объектілерді имитациялайтын дублерлер немесе макеттерді пайдаланады. Тәуелділік инъекциясын қолданған кезде көбінесе бірінші байқалатын пайдасы – сынаудың қарапайымдығы болып табылады.