Guice көмегімен тәуелділік инъекциясы

Новости мира

Guice — бұл тәуелділік инъекциясына арналған құрылым немесе қысқаша DI. Мен бірнеше жыл бойы DI пайдаланудың күшті жақтаушысымын, себебі ол техникалық қызмет көрсетуді, сынақтан өткізуді және код икемділігін жақсартады. Әзірлеушілердің Guice-ке қалай әрекет ететінін бақылай отырып, мен бағдарламашыны жаңа технологияны пайдалануды бастауға сендірудің ең жақсы жолы оны шынымен қарапайым ету екенін түсіндім. Guice шын мәнінде DI-ды шектен тыс жеңілдетеді және нәтижесінде бұл тәсіл Google-да кең тарады. Бұл мақала Guice үйренуді оңайлатуға көмектеседі деп үміттенемін.
Дау үшін емес, қайта қарау үшін

Guice бірінші DI инфрақұрылымынан алыс. Онда көптеген керемет фреймворктар бар (Ресурстар бөлімінде PicoContainer сайтының бетіне сілтеме бар, осы фреймворктардың бірі, даму тарихы мен әртүрлі фреймворктардың байланысы туралы айтады. Кейінірек Guice пайда болды. Қолданыстағы фреймворктардың қайсысы жақсырақ және басқа DI фреймворк керек пе деген пікірталастар тудырды. Кез келген технологияны таңдау сияқты, әр кітапхананың өз артықшылықтары мен кемшіліктері бар. Менің ойымша, Guice маңызды жаңалықтарды қамтиды, бірақ бұл жерде мақала Мен дау-дамайға түспеймін, бірақ Guice мүмкіндіктерін қарастырамын.( Интернетте «guice vs spring» деп іздеу арқылы көптеген қызу пікірталастарды таба аласыз.)

Guice 2.0 бета нұсқасы

Осы жазу кезінде Guice тобы 2.0 нұсқасымен жұмыс істеуде және оны 2008 жылдың соңына дейін шығаруды жоспарлап отыр. Бета нұсқасын Google Code сайтында жүктеп алуға болады (Ресурстардағы сілтемені қараңыз). Бұл жақсы жаңалық, себебі Guice командасы осы шығарылымға Guice кодын пайдалануды және түсінуді жеңілдететін жаңа мүмкіндіктер қосты. Бета нұсқасында соңғы нұсқаға қосылатын кейбір мүмкіндіктер болмаса да, ол әлі де тұрақты және жоғары сапалы нұсқа болып табылады. Шын мәнінде, Google бұл бета нұсқасын өздерінің жұмыс өнімдерінде қолданады. Сізге де солай істеуге кеңес беремін. Мен бұл мақаланы Guice 2.0 үшін арнайы жаздым, кейбір жаңа мүмкіндіктер туралы айтып, 2.0 нұсқасында пайдалануға ұсынылмаған 1.0 нұсқасының мүмкіндіктерін қалдырдым. Guice әзірлеушілері мен қарастыратын функционалдық соңғы нұсқада бета нұсқасынан өзгермейтініне сендірді.

Егер сіз DI деген не екенін және онымен жұмыс істеу үшін негіз не үшін қажет екенін әлдеқашан түсінсеңіз, Guice көмегімен оңай тәуелділік инъекциясына өтуге болады. Әйтпесе, DI артықшылықтары туралы білу үшін оқыңыз.

DI пайдалану мысалы

Мен мысалдан бастайын. Мен суперқаһарманмен ойын қосымшасын жазып жатырмын және Frog Man атты кейіпкерді іске асырдым делік. Листинг 1 қолданба кодын және менің бірінші тестімді қамтиды. (Бірлік сынақтарын жазудың артықшылықтарына сізді сендірудің қажеті жоқ деп үміттенемін.)

Листинг 1. Қарапайым батыр және оның сынағы
жалпы сынып FrogMan {
жеке FrogMobile көлігі = жаңа FrogMobile();
public FrogMan() {}
// мұнда батыр қылмыспен күреседі…
}

жалпы класс FrogManTest TestCase кеңейтеді {
public void testFrogManFightsCrime() {
FrogMan кейіпкері = жаңа FrogMan();
hero.fightCrime();
// бірнеше тексерулер жасаңыз…
}
}

Барлығы жақсы сияқты, бірақ мен сынақты орындаған кезде мен 2-тізімде көрсетілген ерекшелікті аламын:

Листинг 2. Тәуелділіктер қиындық тудыруы мүмкін
java.lang.RuntimeException: өңдеу зауытын іске қосу сәтсіздігі.
HeavyWaterRefinery.(HeavyWaterRefinery.java:6)
FrogMobile сайтында.(FrogMobile.java:5)
FrogMan сайтында.(FrogMan.java:8)
FrogManTest.testFrogManFightsCrime сайтында(FrogManTest.java:10)

FrogMobile менің тестімде жасай алмайтын HeavyWaterRefinery сыныбының нысанын жасауға тырысатын сияқты. Мен оны жұмыс істейтін коммерциялық жүйеде жасай аламын, бірақ ешкім маған тестілеу үшін екіншісін жасауға рұқсат бермейді. Нақты дамуда жиі ұқсас тәуелділіктер бар, мысалы, қашықтағы серверден немесе дерекқордан. Бұл тәуелділіктерді орнату және өзара әрекеттесу қиын және бұл тәуелділіктер сіздің сынақтарыңыздың жиірек сәтсіздікке ұшырауына әкеледі.

DI-ға кіріспе

Бұл мәселені болдырмау үшін интерфейс жасай аласыз (мысалы, Көлік құралы) және 3-тізімде көрсетілгендей FrogMan класының конструкторына сол интерфейсті аргумент ретінде қабылдауға болады: