Testowanie oprogramowania – Wzorce projektowe
Transkrypt
Testowanie oprogramowania – Wzorce projektowe
Testowanie oprogramowania – Wzorce projektowe dr inż. Grzegorz Michalski 17 listopada 2015 Testowanie oprogramowania – Wzorce projektowe 1/66 Plan wykładu Agenda Dlaczego należy stosować wzorce projektowe. Jak zbudowane są wzorce projektowe. Zbiór wzorców projektowych. Testowanie oprogramowania – Wzorce projektowe 2/66 Dlaczego? Motywacja Różne dziedziny inżynierii stawiają sobie odwiecznie następujące pytania: Czy typowe w danej dziedzinie problemy można rozwiązywać w powtarzalny sposób? Czy takie problemy mogą zostać zapisane w sposób abstrakcyjny, w celu wykorzystania ich do opracowania rozwiązań w różnych kontekstach? Testowanie oprogramowania – Wzorce projektowe 3/66 Skąd się wzięły wzorce? “Wzorzec opisuje problem, który powtarza się wielokrotnie w danym środowisku, oraz podaje istotę jego rozwiązania w taki sposób, zby można było je zastosować milion razy bez potrzeby powtarzania tej samej pracy“ Christopher Alexander ”Język wzorców“ 1977 Testowanie oprogramowania – Wzorce projektowe 4/66 Wzorce w budownictwie lądowym Dylemat projektanta budowlanego. (R. Johnson) Testowanie oprogramowania – Wzorce projektowe 5/66 Wzorce w inżynierii oprogramowania. ”Wzorzec projektowy identyfikuje i opisuje pewną abstrakcję, której poziom znajduje się powyżej poziomu abstrakcji pojedynczej klasy, instancji lub komponentu“ E. Gamma, R. Johnson, R. Helm, J. Vlissides, 1994 Testowanie oprogramowania – Wzorce projektowe 6/66 Wzorce w inżynierii oprogramowania, Rodzaje architektoniczne – poziom integracji komponentów, projektowe – poziom interakcji między klasami, analityczne – poziom opisu rzeczywistości, implementacyjne – poziom języka oprogramowania. Testowanie oprogramowania – Wzorce projektowe 7/66 Systematyka wzorców projektowych Wzorce: kreacyjne: abstrakcyjne metody tworzenia obiektów, uniezależnienie systemu od sposobu tworzenia obiektów. strukturalne: sposób wiązania obiektów lub struktur obiektowych, właściwe wykorzystanie dziedziczenia i kompozycji. behawioralne: algorytmy i przydział odpowiedzialności, opis przepływu kontroli i interakcji. Testowanie oprogramowania – Wzorce projektowe 8/66 Szablon wzorca projektowego Wzorzec projektowy jest opisany przez: nazwę – prosty opis istoty wzorca klasyfikację – kategorię, do której wzorzec należy cel – do czego wzorzec służy aliasy – inne nazwy, pod którymi jest znany motywację – scenariusz opisujący problem i rozwiązanie zastosowania – sytuacje, w których wzorzec jest stosowany strukturę – graficzną reprezentację klas składowych wzorca Testowanie oprogramowania – Wzorce projektowe 9/66 Szablon wzorca projektowego Wzorzec projektowy jest opisany przez: uczestników – nazwy i odpowiedzialności klas składowych wzorca współdziałania – opis współpracy między uczestnikami konsekwencje – efekty zastosowania wzorca implementację – opis implementacji wzorca w danym języku przykład – kod stosujący wzorzec pokrewne wzorce – wzorce używane w podobnym kontekście Testowanie oprogramowania – Wzorce projektowe 10/66 Zbiór wzorców projektowych Katalog wzorców projektowych Bandy Czworga (24 wzorce) kreacyjne: Abstract Factory, Builder, Factory Method, Prototype, Singleton strukturalne: Adapter, Bridge, Composite, Decorator, Composite, facade, Proxy, Flyweight behawioralne: Chain of Responsibility, Command, Interpreter, Mediator, Iterator, Memento, Observer, Statem Startegy, Template Method, Visitor Testowanie oprogramowania – Wzorce projektowe 11/66 Singleton Cel wzorca zapewnienie, że klasa posiada jedną instancję wewnątrz całej aplikacji stworzenie punktu dostępowego do tej instancji Testowanie oprogramowania – Wzorce projektowe 12/66 Singleton Struktura i uczestnicy definiuje statyczną metodę getInstance() udostępniającą instancję klasy ogranicza dostęp do konstruktora własnej klasy i podklas jest odpowiedzialny za tworzenie instancji własnej klasy Testowanie oprogramowania – Wzorce projektowe 13/66 Singleton Konsekwencje stosowania Singleton przejmuje odpowiedzialność za tworzenie instancji własnej klasy, Klient nie zarządza instancją klasy; otrzymuje ją na żądanie Singleton może zarządzać także swoimi podklasami Singleton jest zwykle obiektem bezstanowym Singleton zachowuje się podobnie do zmiennej globalnej Singleton może powodować zwiększenie liczby powiązań w systemie Testowanie oprogramowania – Wzorce projektowe 14/66 Pool of Objects Cel wzorca Zarządzaniem grupą Obiektów reprezentujących zasoby wielokrotnego użycia. Ograniczenie kosztów tworzenia i usuwania obiektów. Testowanie oprogramowania – Wzorce projektowe 15/66 Pool of Objcets: struktura Testowanie oprogramowania – Wzorce projektowe 16/66 Pool of Objects Uczestnicy Pool definiuje punkt dostępu do obiektów Object zarządza cyklem życia obiektów Object Object definiuje swój cykl życia może być ponownie wykorzystany Client otrzymuje obiekty Object za pośrednictwem obiektu Pool Testowanie oprogramowania – Wzorce projektowe 17/66 Pool of Objects Konsekwencje Zwiększona wydajność obiekty Object są tworzone w ograniczonej licznie instancji i wykorzystywane wielokrotnie zrównoważone obciążanie zasobów Lepsza hermetyzacja klient nie zajmuje się tworzeniem i obsługą obiektów Object Testowanie oprogramowania – Wzorce projektowe 18/66 Obcerver Cel Utworzenie zależności typu jeden–wiele pomiędzy obiektami Informacja o zmianie stanu wyróżnionego obiektu jest przekazywana wszystkim pozostałym obiektom. Testowanie oprogramowania – Wzorce projektowe 19/66 Observer: struktura Testowanie oprogramowania – Wzorce projektowe 20/66 Observer Uczestnicy Object utrzymuje rejestr obiektów Observer umożliwia dołączanie i odłączanie obiektów Observer Observer udostępnia interfejs do powiadamiania o zmianach Concrete Object przechowuje stan istotny dla obiektów Concrete Observer powiadamia obiekty Concrete Observer Concrete Observer aktualizuje swój stan na podstawie powiadomienia Testowanie oprogramowania – Wzorce projektowe 21/66 Observer Konsekwencje Luźniejsze powiązania pomiędzy obiektami: obiekt Object komunikuje się z innymi obiektami przez interfejs Observer obiekty Subject i Observers mogą należeć do różnych warstw abstrakcji programowe rozgłaszanie komunikatów spójność stanu pomiędzy obiektami Object oraz Observer skalowalność aktualizacji: push: obserwatorzy otrzymują kompletny stan obiektu Object pull: obserwatorzy otrzymują powiadomienie i referencję do obiektu Object Testowanie oprogramowania – Wzorce projektowe 22/66 Factory Method – metoda wytwórcza (Cel) E. Gamma (1995) Zdefiniowanie interfejsu do tworzenia obiektów Umożliwienie przekazania odpowiedzialności za tworzenie obiektów do podklas Umożliwienie wyboru klasy i konstruktora użytego do tworzenia obiektu Testowanie oprogramowania – Wzorce projektowe 23/66 Metoda wytwórcza – struktura Testowanie oprogramowania – Wzorce projektowe 24/66 Metoda wytwórcza – uczestnicy Uczestnicy Produkt – definiuje interfejs obiektów tworzonych przez Metodę wytwórczą ProduktKonkretny – specyficzny produkt tworzony przez Metodę wytwórczą Twórca – definiuje interfejs do tworzenia obiektów typu Produkt TwórcaKonkretny – tworzy obiekt typu ProduktKonkretny Testowanie oprogramowania – Wzorce projektowe 25/66 Metoda wytwórcza – konsekwencje Konsekwencje Przeniesienie odpowiedzialności za tworzenie obiektów Produkt z klienta na obiekt Twórcy Możliwość rozszerzania hierarchii klas Produkt niezależnie od klienta Testowanie oprogramowania – Wzorce projektowe 26/66 Abstract Factory – Fabryka abstrakcyjna ( Cel) Stworzenie interfejsu do tworzenia grup powiązanych ze sobą produktów Rozszerzenie Metody wytwórczej na grupy produktów Testowanie oprogramowania – Wzorce projektowe 27/66 Fabryka abstrakcyjna – struktura Testowanie oprogramowania – Wzorce projektowe 28/66 Fabryka Abstrakcyjna – uczestnicy Uczestnicy Fabryka Abstakcyjna – definiuje interfejs do tworzenia obiektów Produktów abstrakcyjnych Fabryka Konkretna – tworzy obiekty konkretne Produkty należące do jednej grupy Produkt Abstrakcyjny – deklaruje interfejs obiektów Produkt ProdukA/ProduktB – definiuje obiekt konkretnego Produktu Testowanie oprogramowania – Wzorce projektowe 29/66 Fabryka abstrakcyjna – konsekwencje Konsekwencje stosowania Łatwa zmiana całych grup produktów poprzez zmianę używanej konkretnej Fabryki Wydzielenie interfejsu do tworzenia obiektów Odseparowanie klienta od szczegółów implementacji obiektów Produktu Utrudnione dodawanie kolejnych obiektów Product we wszystkich grupach Testowanie oprogramowania – Wzorce projektowe 30/66 Facade – Fasada Cel Dostarczenie jednorodnego interfejsu wyższego poziomu do zbioru różnych interfejsów w systemie Ukrycie złożoności podsystemów przed klientem Testowanie oprogramowania – Wzorce projektowe 31/66 Fasada – struktura Testowanie oprogramowania – Wzorce projektowe 32/66 Fasada – Uczestnicy Uczestnicy Fasada – zna zakres odpowiedzialności poszczególnych podsystemów; deleguje żądania klienta do podsystemów Podsystem – nie wie o obiekcie Fasada wykonuje żądania od klienta i obiektu Fasada Testowanie oprogramowania – Wzorce projektowe 33/66 Fasada – konsekwencje Odseparowanie klienta od podsystemów: 1 2 3 łatwiejsze korzystanie z podsystemów niższe koszty pielęgnacji podsystemów możliwość wymiany/rozbudowy podsystemów Elastyczny dostęp do podsystemów – klient może odwołać się do obiektu Fasada lub bezpośrednio do podsystemów Testowanie oprogramowania – Wzorce projektowe 34/66 Builder – budowniczy Cel Odseparowanie sposobu reprezentacji i metody konstrukcji złożonych struktur obiektowych Wykorzystanie jednego mechanizmu konstrukcyjnego do tworzenia struktur o różnej reprezentacji Testowanie oprogramowania – Wzorce projektowe 35/66 Budowniczy – struktura Testowanie oprogramowania – Wzorce projektowe 36/66 Budowniczy – uczestnicy Uczestnicy Budowniczy – definiuje interfejs do tworzenia obiektów typu Produkt KonkretnyBudowniczy – tworzy specjalizowany obiekt typu Produkt Zarządca – zna sposób realizacji struktury i jej algorytm; zarządza grupą obiektów Builder i podzleca im wykonanie obiektów Produkt Produkt – reprezentuje element składowy struktury; posiada interfejs umożliwiający łączenie z innymi obiektami Produkt Testowanie oprogramowania – Wzorce projektowe 37/66 Budowniczy – konsekwencje Konsekwencje Zmiana implementacji obiektów Produkt nie wpływa na proces konstrukcji struktury Odseparowanie reprezentacji i konstrukcji struktur obiektowych Precyzyjna kontrola nad procesem konstrukcji struktury Ułatwione testowanie elementów struktury Testowanie oprogramowania – Wzorce projektowe 38/66 Prototype – Prototyp Cel Umożliwienie tworzenia obiektów na podstawie przykładowej instancji, a nie poprzez wywołanie konstruktora Testowanie oprogramowania – Wzorce projektowe 39/66 Prototyp – Struktura Testowanie oprogramowania – Wzorce projektowe 40/66 Prototyp – uczestnicy Uczestnicy Prototyp – deklaruje metodę clone(); znacznik obiektów, które mogą się sklonować KonkretnyPrototyp – implementuje metodę clone() tworzącą klon własnego obiektu Testowanie oprogramowania – Wzorce projektowe 41/66 Prototyp – konsekwencje Konsekwencje Możliwość tworzenia obiektów poprzez przykład Uproszczona konstrukcja podobnych obiektów 1 2 pominięcie wyboru konstruktora ograniczenie liczby podklas w systemie Testowanie oprogramowania – Wzorce projektowe 42/66 Wzorzec Dekorator Cel: Umożliwienie dynamicznego dodawania funkcjonalności do obiektu Stworzenie elastycznej alternatywy dla tworzenia podklas Testowanie oprogramowania – Wzorce projektowe 43/66 Dekorator – Struktura Testowanie oprogramowania – Wzorce projektowe 44/66 Dekorator Uczestnicy Component – definiuje wspólny interfejs obiektów ConcreteComponent – realizuje podstawową funkcjonalność obiektu Decorator – posiada referencję typu Component i do tego obiektu przekierowuje komunikaty; rozszerza funkcjonalność obiektu ConcreteComponent Testowanie oprogramowania – Wzorce projektowe 45/66 Dekorator Konsekwencje Zwiększenie elastyczności w przydziale odpowiedzialności w odniesieniu do dziedziczenia Możliwość dodawania funkcjonalności w trakcie wykonywania programu, gdy jest ona potrzebna Tożsamość obiektu z którym komunikuje się klient może się zmieniać wskutek dekoracji Uproszczenie testowania poszczególnych funkcjonalności Testowanie oprogramowania – Wzorce projektowe 46/66 Wzorzec: Most Cel Oddzielenie interfejsu i implementacji obiektu, tak aby mogły zmieniać się niezależnie od siebie Realizacja funkcji interfejsu niezależnie od możliwości języka programowania Testowanie oprogramowania – Wzorce projektowe 47/66 Bridge – Struktura Testowanie oprogramowania – Wzorce projektowe 48/66 Bridge Uczestnicy Abstraction – definiuje interfejs zewnętrzny (abstrakcję): posiada referencję do obiektu typu Implementor oraz deleguje żądania do obiektu typu Implementor ConcreteAbstraction – rozszerza interfejs Abstraction Implementor – definiuje interfejs wewnętrzny (implementację), jest niespokrewniony z typem Abstraction ConcreteImplementor– implementuje typ Implementor Testowanie oprogramowania – Wzorce projektowe 49/66 Bridge Konsekwencje Likwidacja zależności pomiędzy klientem a implementacją Wprowadzenie podziału na niezależne: interfejs (Abstraction) oraz implementację (Implementor) Możliwość niezależnego rozszerzania typów Abstraction oraz Implementor Testowanie oprogramowania – Wzorce projektowe 50/66 Flyweight Cel Współdzielenie obiektów w celu zwiększenia wydajności Wydzielenie z obiektu stanu wewnętrznego (współdzielonego) i zewnętrznego (specyficznego) Testowanie oprogramowania – Wzorce projektowe 51/66 Flyweight – Struktura Testowanie oprogramowania – Wzorce projektowe 52/66 Flyweight Uczestnicy Flyweight – podlega współdzieleniu pomiędzy klientów: definiuje interfejs do przyjmowania i odtwarzania stanu zewnętrznego obiektu ConcreteFlyweight – przechowuje stan wewnętrzny (współdzielony) oraz jest niezależny od kontekstu (z wyjątkiem stanu zewnętrznego) FlyweightFactory – tworzy oraz przechowuje obiekty Flyweight Client – otrzymuje obiekty Flyweight za pośrednictwem FlyweightFactory Testowanie oprogramowania – Wzorce projektowe 53/66 Flyweight Konsekwencje Zmniejszenie wymagań pamięciowych programu poprzez zmniejszenie ogólnej liczby obiektów, zmniejszenie rozmiaru stanu obiektów oraz to, iż stan zewnętrzny może być przechowywany lub bezpośrednio wyliczany Wzrost złożoności obliczeniowej poprzez dodatkowy nakład na zarządzanie stanem zewnętrznym. Testowanie oprogramowania – Wzorce projektowe 54/66 Mediator Cel Uproszczenie komunikacji wielu obiektów Hermetyzacja mechanizmu wymiany komunikatów Testowanie oprogramowania – Wzorce projektowe 55/66 Mediator – Struktura Testowanie oprogramowania – Wzorce projektowe 56/66 Mediator Uczestnicy Mediator – definiuje interfejs dołączania i odłączania kolegów Concrete Mediator – implementuje mechanizm komunikacji pomiędzy obiektami Colleague, posiada on referencje do zarejestrowanych obiektów Colleague Colleague – definiuje wspólny interfejs dla komunikujących się obiektów: posiada referencję do obiektu Mediator oraz komunikuje się z innymi obiektami za pośrednictwem obiektu Mediator Testowanie oprogramowania – Wzorce projektowe 57/66 Mediator Konsekwencje Centralizacja mechanizmu komunikacji: wyłączna odpowiedzialność obiektu Mediator, zmiana mechanizmu wymaga tylko zmiany Mediatora, prostota komunikacji vs. złożoność Mediatora Niezależność obiektów Colleague od siebie Uproszczenie protokołów obiektowych: Zamiana relacji wiele–wiele na relacje jeden-wiele Testowanie oprogramowania – Wzorce projektowe 58/66 Template Method Cel Stworzenie szkieletu algorytmu w postaci klasy Przesunięcie niektórych operacji do podklas Testowanie oprogramowania – Wzorce projektowe 59/66 Template Method – Struktura Testowanie oprogramowania – Wzorce projektowe 60/66 Template Method Uczestnicy AbstractClass – definiuje szkielet algorytmu w postaci metody: szkielet odwołuje się do prostych metod abstrakcyjnych ConcreteClass – implementuje proste metody abstrakcyjne oraz pokrywa inne, wybrane metody odziedziczone z AbstractClass Testowanie oprogramowania – Wzorce projektowe 61/66 Template Method Konsekwencje Odwrócona struktura odwołań: zasada „Proszę nie dzwonić, to my zadzwonimy” Nadklasa odwołuje się do metod w podklasach Testowanie oprogramowania – Wzorce projektowe 62/66 Iterator Cel Umożliwienie dostępu do elementów kolekcji bez ujawniania jej wewnętrznej implementacji. Iterator z reguły umożliwia dostęp sekwencyjny, jednak możliwy jest równiez dostęp bezpośredni do elementów. Testowanie oprogramowania – Wzorce projektowe 63/66 Iterator – Struktura Testowanie oprogramowania – Wzorce projektowe 64/66 Iterator Uczestnicy Agregator – ogólny interfejs każdej kolekcji: deklaruje interfejs do tworzenia iteratora ConcreteAgregator– tworzy iterator specyficzny dla własnej struktury Iterator – definiuje interfejs sekwencyjnego dostępu do obiektu Agregator (getFirst(), getNext(), hasNext()) ConcreteIterator – implemenetacja interfejsu Iterator specyficzna dla konkretnej kolekcji Testowanie oprogramowania – Wzorce projektowe 65/66 Iterator Konsekwencje Abstrakcyjny dostęp do elementów kolekcji Niezależność od implementacji kolekcji Możliwość współistnienia różnych iteratorów w jednej kolekcji Możliwość istnienia wielu iteratorów naraz: każdy iterator przechowuje informacje o aktualnym położeniu (pozycyji). Iteratory są obiektami stanowymi. Testowanie oprogramowania – Wzorce projektowe 66/66