Dependency injection Jiří Matula Neruším? Ráda bych vám pomohla

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

Vývoj aplikací s využitím JavaFX
Funkce Připomeňme si program pro výpočet faktoriálu:
Ať se postará někdo jiný, najmeme si programátory z Číny. Čuníkům vstup zakázán.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Singleton 1 1.
Polymorfismus Dědičnost
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Zend Framework 2. Svět se změnil! Zapomeňte! Všechno je jinak!
Návrh a tvorba WWW Cvičení 6
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
Chain of responsibility Martin Malý prezentace na předmět Návrhové vzory (PRG024) na MFF UK
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Objektové programování
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
Dependency injection Předávání závislostí Petr Kalivoda
6. cvičení Polymorfismus
PB161 Právo friend, přetěžování operátorů, přetypování PB161 | Friend, operátory PB161 – Programování v jazyce C++ Objektově Orientované Programování.
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014.
Ing. Jan Mittner Životní cyklus požadavku 2. Moduly 3. Pluginy 4. Jak řešit komponenty typu menu 5. atd. 2.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
PB161 Principy OOP - rozhraní, dědičnost PB161 | Principy OOP - Dědičnost, rozhraní
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Obchodní akademie a Střední odborná škola, gen. F. Fajtla, Louny, p.o. Osvoboditelů 380, Louny Číslo projektu CZ.1.07/1.5.00/ Číslo sady 04Číslo.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
Windows 7 & Internet Explorer 8 vývoj aplikací a kompatibilita Štěpán Bechynský, Ondřej Štrba Developer Evangelists
Odpověď na otázku „why“:
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
(a) little, (a) few málo, trochu vypracovala: Mgr. Monika Štrejbarová.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
Jak psát „Čistý kód“ A hlavně se v něm pak neztratit Jan Pospíšil Senior Technology
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Singleton
Návrhový vzor Flyweight
Abstract Factory.
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Bridge.
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - CVIČENÍ
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Scoped Locking, Strategized Locking
Dfdfdf.
Composite “Spojuj a panuj”.
Transkript prezentace:

Dependency injection Jiří Matula Neruším? Ráda bych vám pomohla s Vaší závislostí na ostatních! Jiří Matula

Obsah Co je to Dependency Injection (DI) Motivace proč se zabývat DI Typy DI Problémy DI Container Závěr - testík

Dependency injection (DI) Návrhový vzor z rodiny IoC (Inversion of Control). Problém : Skryté závislosti třídy (skryté = těžce kontrolovatelné). Řešení: zřejmé předávání závislostí = odebrání třídám zodpovědnosti za získávání objektů, které potřebují ke své činnosti. Uplatňuje se princip popisu závislostí pomocí API třídy. Lze si jej představit pod mottem - “Když něco chceš, tak si o to řekni!”

Vizualizace závislostí (Cheese) (Vegetable) (Meat) (Friends) (Water) (Alcohol) (Satisfied person)

Proč se obtěžovat s DI? Zvolnění vazeb mezi objekty, jednodušší testovatelnost, nutí programátora řešit vazby mezi objekty = čistější přehlednější kód, pomáhá dodržovat správný objektový návrh, pravdivé API tříd. Junior programmer Garry – “Whatever, I love my spaghetti !”

Constructor Injection Hlášení závislosti přímo v konstruktoru třídy. Problémy: Lazy loading (vytváření objektů v momentě, kdy jsou opravdu potřeba), Constructor hell (příliš mnoho závislostí v konstruktoru třídy). public void Company() { this.worker = new Worker(); this.slacker = new Slacker(); } // constructor injection public void Company(Worker worker, Slacker slacker) { this.worker = worker; this.slacker = slacker; }

Setter Injection Hlášení závislostí přímo při volání setter funkce. Lze dobře uplatnit pro inicializaci objektu mimo konstruktor třídy. @Inject public void setHelper(Helper helper) { this.helper = helper; }

Property injection Je velmi podobné constructor injection. K hlášení závislostí se používá anotací přímo u deklarace proměnné. Výhodou je stručnost. Nutností je DI container, který bude umět s touto anotací pracovat a nastavit odkazující proměnnou na již inicializovaný objekt. public class ClientsController { // Property injection @Inject private final UserDAO userDAO; public ClientsController() { } public class ClientsController { private UserDAO userDAO; public ClientsController(UserDAO userDao) { this.userDao = userDao; // constructor injection }

Interface Injection Nehlásíme závislost na konkrétní třídu, hlásíme závislost pouze na interface, jedná se o velmi silný nástroj – zvyšuje úroveň abstrakce v kódu. interface Employee { public void work(); public void pretendWorking(); } public Company(Employee worker, Employee slacker) { this.worker = worker; this.slacker = slacker; } public void setHelper(Employee helper) { this.helper = helper; }

Spaghetti code, je v souladu s DI? public class Company{ protected Worker worker; protected Slacker slacker; public Companz() { this.worker = new Worker(); this.slacker = new Slacker(); } public void open(){ this.worker.work(); this.slacker.pretendWorking(); customer = new Customer(); System.out.println(“<h1> Welcome! How can I help you?</h1>”); this.worker.serverCustomer(); System.out.println(“<p>” + customer.wish + ”</p>”); Senior programmer John - “Garry, you are fired!”

Problémy - Constructor hell Přílišné množství parametrů již přímo v konstruktoru třídy, odhaluje tak nesprávné rozvržení tříd, řešit lze za pomocí refaktoringu tříd. public function Controller(IHttpRequest request, IHttpResponse response, User user, UserModel userModel, Language language, DataSource dataSource, ....) { // rest of the code } Jesus Christ, so many dependencies!!

Problémy - DI vs. Lazy loading Lazy loading – návrhový vzor, kdy se vytváření instance objektu se odkladá do doby než je opravdu potřeba, z důvodu optimilizace je přínosné tento návrhový vzor používat, naopak DI požaduje pro své třídy již vytvořené instance (závislosti). Junior Garry – No way, they troll me all the time!

Service Locator – zlé dvojče DI Jedná se také o návrhový vzor, nicméně jde proti smyslu DI (antipattern) Třída se totiž nehlásí k jednotlivým závislostem. Všechny závislosti získává skrze globální objekt (service locator). Nicméně lze přejít pak jednoduše k DI. public class ClientsController { private final UserDAO userDAO; public ClientsController(ServiceContainer $services) { this.userDao = (UserDao)$services->getService("UserDAO"); } Hell yeah, your classes are liars again!

DI Container (DIC) Příliš mnoho závislostí (závislé třídy) => potřebujeme je spravovat, k těmto účelům slouží právě DI kontejner, DI kontejner dává již připravené instance tříd vždy jeho žadateli, pravidlem je, že o existencí DI kontejneru by mělo vědet minimální množství kódu, příklad: Google Guice Cointainer (není jediný).

Pohled na aplikaci jako stavbu tříd Application Database Connection DaoServices Resources DataSource GUI Other Clasess…

Na co teda DI container? Pokud svou aplikaci popíšete jako strom závislostí. Není nic jednoduššího než si ji nechat sestavit právě DI Containerem. Ten drží konfiguraci tříd celé aplikace, nahrazuje pokoutné Environment objekty. Yess, sir! Hey container, gimme the Application!

Konfigurace DI containeru Slouží k správné inicializaci prostředí aplikace, resp. jejich tříd. To, jakým způsobem se konfigurace provádí, záleží na konkrétní implementaci containeru (anotace, třídní objekt, xml soubor...) import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; public class DependencyConfig implements Module { @Override public void configure(Binder binder) { binder.bind(Storage.class).to(DatabaseStorage.class).in(Scopes.SINGLETON);} //example of Google Guice Container configuration }

DIC a persistence objektů DI kontejnery nám umožňují řídit životnost objektů => obrovský potenciál DI Problém návrhového vzoru Singleton: Nikdy nemůžeme dopředu vědět zda třída bude opravdu Singletonem či nikoli. Není přímou zodpovědností třídy se starat zda bude jedináčkem či nikoli. Za pomocí DI kontejneru se tyto problémy dají vyřešit.

DIC – není Singleton jako Singleton public class Company { protected Worker worker; protected Slacker slacker; public Firma() { this.worker = new Worker(); this.slacker = new Slacker(); } public class Company { private static Company instance = null; private Company() {} public static Company getInstance() { if (instance == null) { instance = new Singleton(); } return instance;

Kontrolní otázky V čem je podstata návrhového vzoru Dependency injection (DI)? Jaké výhody přináší DI? Jaké máme typy DI? Jaké problémy mohou nastat při aplikování vzoru DI? K čemu slouží Dependency Injection Container? Dalo vám to něco?

Questions?