Občasník názorů jedné karkulky

Inversion of Control, Dependency Injection

Inversion of Control

Inversion of Control (IoC), nebo také obrácené řízení, je návrhový vzor, který umožňuje uvolnit vztahy mezi jinak těsně svázanými komponentami. V klasickém modelu programování vytváříme nějakou třídu, která pak využívá další třídy a tak dále. Tím jsou potom třídy velmi pevně svázány a změna používané třídy za jinou vyžaduje zásah do kódu. IoC umožňuje uvolnit tuto vazbu, což nejjednodušeji vystihuje Hollywoodský princip „Nevolejte nám, my se ozveme.“ [1]. To je klasická odpověď, kterou dostávají amatérští herci, kteří se snaží získat v Hollywoodu nějakou roli ve filmu, seriálu apod. Proto tedy Hollywoodský princip. V podstatě to znamená, že třída nevytváří sama instance dalších tříd, které potřebuje, ale jsou jí dodány nějakým způsobem z vnějšku. Těchto způsobů existuje několik, nejznámější jsou tři: [2]

  • Constructor Injection – třídy, do nichž je vkládána instance další třídy, kterou potřebují, musejí mít vytvořen konstruktor, který umí přijímat potřebné typy objektů, příkladem využití může být například PicoContainer [3]
  • Setter Injection – třídy, do nichž jsou vkládány instance, musí mít definovány potřebné settery, setter injection používá například Spring Framework
  • Interface Injection – nejprve je definováno rozhraní, které určuje metody, pomocí kterých budou nastavovány instance objektů, které příslušná třída potřebuje, každá třída, která chce tyto instance využívat, musí implementovat příslušné rozhraní, příkladem využití jsou například Apache excalibur[4], nebo Castle MicroKernel [5], které vznikly z Avalon Frameworku [6].

IoC si ještě ukážeme na jednoduchém příkladu. Mějme třídu SeznamAut, která umí pomocí nějaké své metody získat seznam všech aut od některého výrobce. V metodě, která se bude jmenovat ziskejSeznamPodleVyrobce využívá třídu VyhledavacAut, pomocí které získá auta právě od vybraného výrobce. To je tedy klasický přístup bez využití IoC kontejneru, názorně ho můžeme zobrazit podle obrázku:

Z obrázku je názorně vidět, že SeznamAut potřebuje znát implementace rozhraní VyhledavacAut a je s ním tak velmi těsně svázán. Pro uvolnění této vazby můžeme využít právě IoC. Místo toho, aby SeznamAut inicializoval třídu VyhledavacAutImplementace, využije některou z technik IoC, například bude mít setter metodu, pomocí které mu bude nastavena nějaká implementace rozhraní VyhledavacAut. Nemusí už tedy znát implementaci rozhraní, kterou bude využívat. K tomu je ale potřeba, aby zde existoval právě nějaký IoC kontejner, který se o toto postará. Opět ilustrujeme názorně pomocí obrázku:

Z obrázku je patrné, že SeznamAut je nyní závislý pouze na rozhraní VyhledavacAut. Tím jsme uvolnili závislost mezi třídou SeznamAut a konkrétní implementací rozhraní VyhledavacAut. O sestavení jednotlivých komponent dohromady se nyní stará IoC kontejner.

Dependency Injection [7]

Dependency injection (DI), nebo také vkládání závislostí, je v podstatě novější název pro IoC, zužuje ale také okruh, na který se vztahuje. Jedná se už o konkrétní techniku využití IoC. DI má několik zásadních výhod pro programování, jsou to zejména tyto:

  • Jednodušší psaní a údržba jednotlivých komponent, díky vzájemné menší závislosti.
  • Je výrazně jednodušší kód testovat.
  • Není třeba starat se o přetypování tříd, protože se o něj stará IoC kontejner.
  • Závislosti komponent jsou definovány explicitně, je tedy jednodušší se v nich vyznat.
  • IoC kontejner ve většině případů nevyžaduje speciální zásah do kódu aplikace, jednotlivé komponenty je pak možné snadno využít i jinde bez nutnosti přepisování kódu.

DI má samozřejmě i některé nevýhody, mezi nejvýznačnější patří tyto[8]:

  • Pro programátora, který nezná návrhový vzor IoC je těžké vyznat se v takto napsaném kódu.
  • Pro jednodušší aplikace je zbytečné zabývat se složitým kódem, ale je snazší napsat aplikaci v klasické Javě.
  • Pokud používané IDE [9] nezná IoC, je složitější vývoj aplikací.

Sdílet

Komentáře

seily je vidět, že na tom makáš - jen tak dál, vypadá to zajímavě;-)!

sqdw No... doufám, že z těch obrázků je něco vidět :-)

seily Vidět jo, jen se to blbě čte:-D....

Pro přidání komentáře se musíš přihlásit nebo registrovat na signály.cz.

Autor blogu Grafická šablona Nuvio