Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013



Podobne dokumenty
Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2014

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2016

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2018

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Spring Framework - wprowadzenie i zagadnienia zaawansowane

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Pico. Wstęp do kontenerów IoC.

Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017

Java Persistence API - zagadnienia zaawansowane

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Scala - programowanie obiektowo-funkcyjne

Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne

Program szkolenia: Symfony, nowoczesny framework PHP

Wzorce projektowe i refaktoryzacja

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1

Programowanie obiektowe

Programowanie Zespołowe

Podstawy frameworka Spring

Wzorce projektowe Michał Węgorek

Procesowa specyfikacja systemów IT

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Web frameworks do budowy aplikacji zgodnych z J2EE

Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, praktyki i narzędzia

Instrukcja laboratoryjna nr.2

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce odpowiedzialności

PHP 5 język obiektowy

Program szkolenia: Test Driven Development (TDD) using Spock or JUnit 5

Modelowanie i Programowanie Obiektowe

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Wzorce projektowe. dr inż. Marcin Pietroo

Programowanie komponentowe 5

Programowanie obiektowe

Kontenery IoC dla Java Guice 3.0

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

Zaawansowane Aplikacje Internetowe

Programowanie obiektowe

Programowanie obiektowe

Receptury - niezbędnik projektanta i architekta

Program szkolenia: Wzorce projektowe w C++

Podstawy Programowania Obiektowego

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2013

MVVM Light Toolkit. Julita Borkowska

Wzorce projektowe. dr inż. Marcin Pietroo

Adaptywny kod : zwinne programowanie, wzorce projektowe i SOLID-ne zasady / Gary McLean Hall. Gliwice, cop Spis treści

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Biorąc udział w projekcie, możesz wybrać jedną z 8 bezpłatnych ścieżek egzaminacyjnych:

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Dobry start do profesjonalnego programowania w C++ dla. początkujących programistów

Program szkolenia: Zaawansowane programowanie w C++

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Szkolenie wycofane z oferty

Zaawansowane programowanie w C++ (PCP)

Tytuł szkolenia: Angular 4 - budowanie nowoczesnych i wydajnych aplikacji przeglądarkowych

Wykład Ćwiczenia Laboratorium Projekt Seminarium

Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne

Wykład 4. Projektowanie. MIS n Inżynieria oprogramowania Październik 2014

UNIX: architektura i implementacja mechanizmów bezpieczeństwa. Wojciech A. Koszek dunstan@freebsd.czest.pl Krajowy Fundusz na Rzecz Dzieci

Przesłanki powstania książki... xvi Dla kogo przeznaczona jest ta książka?... xvi Co znajdziemy wewnątrz książki?... xvii

PRZEWODNIK PO PRZEDMIOCIE

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Klasy abstrakcyjne i interfejsy

OSGi Agata Hejmej

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Program szkolenia: Architektura aplikacji i systemów - Wzorce architektoniczne dla projektantów

Wykład 1 Inżynieria Oprogramowania

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

Projektowanie obiektowe Wzorce projektowe

Technologie COM i ActiveX COM - Component Object Model

Projektowanie obiektowe oprogramowania Wykład 4 - SOLID GRASP Wiktor Zychla 2012

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

Programowanie obiektowe - 1.

Technologia Programowania 2016/2017 Wykład 4

Projektowanie, tworzenie aplikacji mobilnych na platformie Android

Program szkolenia: REST i Microservices w PHP

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

DLA SEKTORA INFORMATYCZNEGO W POLSCE

UML a kod. C++, Java i C#

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

KARTA PRZEDMIOTU. Warsztaty z programowania mobilnego w Python. Python Mobile Programming Workshop

Modelowanie. Wykład 1: Wprowadzenie do Modelowania i języka UML. Anna Kulig

Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.

AUREA BPM HP Software. TECNA Sp. z o.o. Strona 1 z 7

Metodyka projektowania komputerowych systemów sterowania

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

problem w określonym kontekście siły istotę jego rozwiązania

Egzamin / zaliczenie na ocenę*

Programowanie współbieżne i rozproszone

Tworzenie komponentów logiki biznesowej i warstwy dostępu do danych w oparciu o EJB3.0/JPA lub EJB 3.1/JPA2

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Podstawy modelowania programów Kod przedmiotu

Sekcja I: Instytucja zamawiająca/podmiot zamawiający

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Transkrypt:

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013 1 Dependency Injection Dependency Injection = zestaw technik pozwalających tworzyć struktury klas o luźniejszym powiązaniu. Trzy kluczowe skojarzenia: 1. Późne wiązanie możliwość modyfikacji kodu bez rekompilacji, wyłącznie przez rekonfigurację, programming against interfaces (DIP) 2. Ułatwienie tworzenia testów jednostkowych zastąpienie podsystemów przez ich stuby/fake i 3. Uniwersalna fabryka tworzenie instancji dowolnych typów według zadanych wcześniej reguł 2 więc przypomnijmy sobie przykład dla Dependency Inversion Principle Zalety: 1. Rozszerzalność (OCP) teoretycznie możliwe rozszerzenia o konteksty nie znane w czasie planowania 2. Równoległa implementacja dobrze zdefiniowany kontrakt zależności pozwala rozwijać oba podsystemy niezależnie 3. Konserwowalność (maintainability) dobrze zdefiniowana odpowiedzialność to zawsze łatwiejsza konserwacja 4. Łatwość testowania - obie klasy mogą być testowane niezależnie; ta z wstrzykiwaną zależnością może być testowana przez wstrzyknięcie stuba/fake a 5. Późne wiązanie możliwość określenia konkretnej klasy bez rekompilacji 3 Twarde zależności vs miękkie zależności Jeszcze inne spojrzenie na modularność: 1. Sztywna zależność (stable dependency) klasyczna modularność; zależne moduły już istnieją, są stabilne, znane i przewidywalne (np. biblioteka standardowa)

2. Miękka zależność (volatile dependency) modularność dla której zachodzi któryś z powodów wprowadzenia spoiny: a. Konkretne środowisko może być konfigurowane dopiero w miejscu wdrożenia (późne wiązanie) b. Moduły powinny być rozwijane równolegle 3. Spoina (seam) miejsce, w którym decydujemy się na zależność od interfejsu zamiast od konkretnej klasy Uwaga. O ile zastosowanie technik DI pozwala na wprowadzenie miękkich zależności w miejscach spoin, o tyle zwykle zależności do samych ram DI mają charakter sztywny. 4 Kluczowe podwzorce DI (na przykładzie Unity) 4.1 Składanie obiektów (Composition) 1. Kontener 2. Rozwiązywanie zależności sztywnych 3. Rozwiazywanie zależności miękkich 4. Rozwiązywanie instancji 5. Rozwiązywanie grafu zależności 6. Wstrzykiwanie przez konstruktor najdłuższy lub wskazany ([InjectionConstructor]) zapewnienie że zależność jest zawsze dostępna

7. Wstrzykiwanie przez metodę atrybut [InjectionMethod] zapewnienie że w różnych kontekstach (metodach) wstrzykiwane mogą być inne zależności 8. Wstrzykiwanie przez właściwości ([Dependency]) zapewnienie że domyślna zależność jest dostępna, ale może być zmodyfikowana 9. Budowanie obiektu wyprodukowanego na zewnątrz 10. Rejestracja metody fabrykującej zapewnienie możliwości tworzenia zależności przez dowolną metodę fabrykującą 4.2 Zarządzanie czasem życia obiektów (Lifecycle Management) http://msdn.microsoft.com/en-us/library/ff660872(pandp.20).aspx 1. Transient ulotne 2. ContainerControlled singletony 3. Hierarchical singletony, ale inne w dziedziczonych kontenerach

4. PerThread inny obiekt per wątek 5. Custom (przykład) 4.3 Konfiguracja kontenera (Configuration) 4.4 Przechwytywanie żądań (Proxy) Typowe zagadnienia przekrojowe (cross-cutting concerns): 1. Audytowanie 2. Logowanie 3. Monitorowanie wydajności 4. Bezpieczeństwo 5. Cache owanie 6. Obsługa błędów Frameworki DI często obsługują podzbiory tak zdefiniowanego AOP dzięki temu że zamiast obiektu mogą zwracać proxy do niego. Przykład w Unity: 1. InterfaceInterceptor tworzy proxy przez delegowanie, pozwala przechwycić tylko metody interfejsu

2. VirtualMethodInterceptor tworzy proxy przez dziedziczenie, pozwala przechwycić tylko metody wirtualne 5 ServiceLocator vs Composition Root+Factory Jak w rozbudowanej, wielomodułowej aplikacji radzić sobie z rozwiązywaniem zależności do usług? Żeby rozwiązad zależnośd potrzebny jest kontener. Innymi słowy, w kodzie, w miejscu w którym potrzebujemy instancji usługi, potrzebny jest kontener. Najgorsze rozwiązanie przekazywad kontener jako parametr do klas/metod. Trochę lepsze rozwiązanie Service Locator. Service Locator = schowanie singletona kontenera DI za fasadą, pozwalającą z dowolnego miejsca aplikacji na rozwiązanie zależności do usługi. Pozwala znacznie zredukować jawne zależności miedzy klasami. Service Locator nie musi być przekazywany jako zależnośd, bo jako singleton, może byd osiągalny z dowolnego miejsca. Uwaga! Service Locator uważa się za antywzorzec z uwagi na dwa niepożądane zjawiska: 1. Service Locator powoduje owszem zredukowanie zależności między klasami, ale kosztem wprowadzenia zależności do podsystemu DI. To bardzo nieeleganckie. Zastosowanie DI powinno być przezroczyste dla kodu struktura klas powinna być taka sama bez względu na to czy wspomagamy się ramą DI czy nie. 2. Zależności rozwiązywane przez SL są niejawne rozwiązywanie pojawia się w implementacji. Na poziomie struktury (metadanych) nie ma jawnej informacji że klasa A zależy od B A sobie samo wykonstruuje B za pomocą SL kiedy jest mu to potrzebne. Problem w tym, że ponieważ tej zależności nie widać na poziomie struktury, może być trudna do wychwycenia i przez to powodować błędy w czasie wykonania programu (wtedy, gdy zapomni się zarejestrować implementację B w kontenerze).

Alternatywą dla SL jest Compositon Root. Composition Root = fragment kodu wykonywany zwykle na starcie aplikacji, odpowiedzialny za zdefiniowanie wszystkich zależności. W idealnej rzeczywistości, tylko w Composition Root pojawia się zależność do DI, a cała reszta aplikacji jest jej pozbawiona. Sam CR jest zbyt słaby żeby rozwiązać problem rozwiązywania zależności. Naiwne zastosowanie spowodowałoby konieczność wytworzenia wszystkich instancji obiektów ze wstrzykiwanymi zależnościami już na starcie aplikacji. To oczywiście niemożliwe. W praktyce CR należy wesprzeć miękką fabryką fabryką z miękką zależnością do implementacji dostawcy obiektów. W CR tworzy się dostawcę wykorzystującego kontener, klasa kiedy potrzebuje usługi używa fabryki. Takie podejście eliminuje całkowicie problem przezroczystości ramy DI dla kodu, można sobie bowiem wyobrazić dostawcę usługi, który używa DI i innego dostawcę który nie używa DI. 6 Literatura uzupełniająca 1. Dhanji R. Prasanna Dependency Injection (2009, Java) 2. Mark Seemann Dependency Injection in.net (2012, C#) (źródło ilustracji i planu prezentacji)