Wzorce projektowe Jacek Matulewski

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Programowanie obiektowe
Wzorce.
Zaawansowane metody programowania – Wykład V
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Generics w .NET 2.0 Łukasz Rzeszot.
Obiektowe metody projektowania systemów Design Patterns STRATEGY.
Programowanie w środowisku sieciowym
argumenty wiersza poleceń: getopt
Programowanie Obiektowe w Javie (c.d.)
Programowanie obiektowe w Javie
OOP - programowanie zorientowane obiektowo w VB.NET
Architektura systemu Gra strategiczna „Strusia Jama”
Serwery Aplikacji ASP .NET Web Objects Arkadiusz Popa.
Model – View - Controler
W ZORCE P ROJEKTOWE … czyli ktoś już rozwiązał Twoje problemy!
Obiektowe metody projektowania systemów
Obiektowe metody projektowania systemów
Obiektowe metody projektowania systemów Command Pattern.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Pakiety i ATD 1 Definicja. Pakietem albo jednostką programową nazywamy grupę logicznie powiązanych elementów, które mogą być typami, podtypami, obiektami.
Wzorce projektowe (Design Patterns)
Inżynieria Oprogramowania
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Technologie tworzenia aplikacji internetowych Wykład 3
Tworzenie aplikacji mobilnych
Programowanie obiektowe III rok EiT
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Projektowanie obiektowe
Tworzenie Aplikacji Internetowych
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
Zawansowane techniki programistyczne
Systemy zarządzania treścią Wykład 5
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Programowanie w języku C++
Dobry kod OO Jeżeli zapytamy statystycznego programistę z czym kojarzy mu się dobry kod OO to najprawdopodobniej będzie mówił o wzorcach projektowych.
Programowanie strukturalne i obiektowe C++
Diagram klas Kluczowymi elementami są: klasy (class)
Walidacja danych alina suchomska.
Proces tworzenia oprogramowania Proces tworzenia oprogramowania jest zbiorem czynności i związanych z nimi wyników, które prowadzą do powstania produktu.
DOM Ewa Dukała Piotr Muszyński. DOM DocumentBuilder Factory Document Builder XML Data object obiectobject DocumentDOM.
Obiektowe metody projektowania systemów Adapter. Wstęp: „Dostosowanie interfejsu klasy do interfejsu, którego oczekuje użytkownik. Adapter umożliwia współprace.
Obiektowe metody projektowania systemów Abstract Factory design pattern (aka. Kit)
Zakres Wzorce projektowe - kreacyjne -Factory Method -Abstract Factory.
Paweł Starzyk Obiektowe metody projektowania systemów
Wzorce Projektowe w JAVA
Programowanie Zaawansowane
Wzorce projektowe w C++ WWW: Jacek Matulewski Instytut Fizyki, UMK WWW:
Wzorce projektowe w C# WWW: Jacek Matulewski Instytut Fizyki, UMK WWW:
Inżynieria oprogramowania Wzorce konstrukcyjne WWW: Jacek Matulewski Instytut Fizyki, UMK.
Inżynieria oprogramowania Wzorce strukturalne WWW: Jacek Matulewski Instytut Fizyki, UMK.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Wzorzec MVC na przykładzie CakePHP
Inżynieria oprogramowania Wzorce projektowe
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Inżynieria oprogramowania Wzorzec architekt. MVC
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
Założenia projektowe Javy
PGO Przeciążanie metod i konstruktorów
Zapis prezentacji:

Wzorce projektowe Jacek Matulewski e-mail: jacek@phys.uni.torun.pl WWW: http://www.fizyka.umk.pl/~jacek/dydaktyka/inzynieria/index.html

Główne źródło Głównym materiałem źródłowym jest książka tzw. gangu czworga pt. „Wzorce projektowe”.

Przykładowy projekt: „Labirynt” Aplikacja konsolowa zaprojektowana zgodnie ze wzorcem architektonicznym MVC, czyli Model-View-Controler Model – dane i logika labiryntu Widok – moduł rysujący labirynt w konsoli Kontroler – przyjmuje wejście z klawiatury, modyfikuje model Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

Architektura MVC Kontrola oraz przepływ informacji między modułami aplikacji w architekturze MVC Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

Architektura MVC Jest wiele wersji samego MVC (+ MVP) My zaimplementujemy wersję z pasywnymi modelem i widokiem (passive) oraz nadzorującym kontrolerem (supervising) lepiej pasujący do konsoli (bez zdarzeń) Kontrolera zredukujemy do funkcji main Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

Przykładowy projekt: „Labirynt”

Model (klasa Labirynt) Pasywny model przechowujący stan aplikacji VC++: Solution Explorer, View Class Diagram

Model (klasa Labirynt) Klasy modelu class MiejsceWLabiryncie { public: virtual RezultatPróbyWejścia SpróbujWejść() = 0; virtual int Wejdź(int indeksBieżącejKomórki) { return -1; } virtual bool Otwórz() { return false; } }; class Komórka : public MiejsceWLabiryncie { ... enum RezultatPróbyWejścia { Nieokreślony = 0, Powodzenie, NieMożnaWejść, Zamknięte }; enum Kierunek { Północ = 0, Południe = 1, Wschód = 2, Zachód = 3 }; enum StanGry { Niezakończona = 0, Śmierć, Wygrana };

Model (klasa Labirynt) Klasy modelu class Komórka : public MiejsceWLabiryncie { private: int indeks; MiejsceWLabiryncie* sąsiednieMiejsca[4]; public: Komórka(int indeks); MiejsceWLabiryncie* PobierzMiejscePoStronie(Kierunek kierunek) const; void PowiążZMiejscem(Kierunek kierunek, MiejsceWLabiryncie* miejsce); virtual RezultatPróbyWejścia SpróbujWejść(); virtual int Wejdź(int indeksBieżącejKomórki); int PobierzIndeks(); bool OtwórzDrzwi(Kierunek kierunek); bool OtwórzDrzwi(); };

Model (klasa Labirynt) Klasy modelu class Labirynt { private: int liczbaKomórek; PKomórka* komórki; int indeksBieżącejKomórki, indeksCelu; StanGry stanGry = Niezakończona; public: Labirynt(int liczbaKomórek, int indeksPoczątkowejKomórki, int indeksCelu); ~Labirynt(); void DodajKomórkę(int indeks, Komórka* komórka); Komórka* PobierzBieżącąKomórkę(); RezultatPróbyWejścia PrzejdźWKierunku(Kierunek kierunek); void Zakończ(); StanGry PobierzStanGry(); };

Widok (klasa Widok) Klasa widoku (zbiór funkcji bez własnego stanu) #pragma once #include "Model.h" class Widok { private: Labirynt* model; public: Widok(Labirynt* model); static void WyświetlInformacjęOKomórce(Komórka* komórka); void WyświetlInformacjęOBieżącejKomórce() const; static void WyświetlInformacjęOPróbiePrzejściaWKierunku(Kierunek kierunek); void WyświetlInformacjęORezultaciePróbyPrzejścia(RezultatPróbyWejścia) const; void WyświetlInformacjęOPróbieOtwarciaDrzwi() const; void WyświetlInformacjęORezultaciePróbyOtwarciaDrzwi(bool wynik) const; void WyświetlInformacjęOStanieGry() const; };

Kontroler (funkcja main) #pragma once #include "Model.h" #include "Widok.h" class Kontroler { protected: Labirynt* model; Widok* widok; void SpróbujPrzejść(Kierunek kierunek); void SpróbujOtworzyćDrzwi(); public: Kontroler(void); ~Kontroler(void); void Uruchom(); };

Funkcja main Funkcja main widzi tylko kontroler. Kontroler tworzy instancje modelu i widoku: #include "Kontroler.h" int main(int argc, char* argv[]) { Kontroler kontroler; kontroler.Uruchom(); return 0; }

Przykładowy projekt: „Labirynt” Piszemy kod…

Przykładowy projekt: „Labirynt” Zadania domowe / dwa konkursy (1-3, 4): Do widoku dodać funkcję rysującą bieżącą komórkę (ściany za pomocą znaków *) Przygotować alternatywny widok pokazujący całą mapę z bieżącą komórką oznaczoną # Przygotować zestaw testów jednostkowych dla modelu i widoku (100% pokrycia) Przygotować alternatywny widok korzystający z OpenGL (konkurs)

Wzorce konstrukcyjne Wzorce pozwalające oddzielić proces tworzenia instancji obiektów od jego definicji: Budowniczy (Builder) Fabryka abstrakcyjna (Abstract Factory) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton (Singleton)

Budowniczy (Builder) Założenia: Model posiada klasę organizującą (Labirynt) oraz kilka klas dodatkowych (Komórka, Ściana, itd.) Cel: 1. Wydzielenie kodu służącego do budowy złożonego produktu (u nas obiektu modelu) z jego klasy 2. Przesłonięcie szczegółów implementacji modelu (tzw. reprezentacji wewnętrznej). 3. Korzystanie z różnych budowniczych prowadzi do tworzenia różnych produktów bez zmiany kodu funkcji tworzącej i zasadniczej struktury produktu

Budowniczy (Builder) Implementacja: Do modelu dodana zostaje klasa służąca tylko do stopniowego budowania złożonej instancji głównej klasy modelu. Po zmianach ważne będą już tylko dwie klasy modelu: Labirynt i BudowniczyLabiryntu Nazwy używane w kontekście tego wzorca: Kontroler – Director, kierownik BudowniczyLabiryntu – Builder, budowniczy StdBudowniczyLabiryntu – Concrete Builder Labirynt – Product, produkt

Budowniczy (Builder) http://zenit.senecac.on.ca/wiki/index.php/Builder

Budowniczy (Builder) http://zenit.senecac.on.ca/wiki/index.php/Builder

Budowniczy (Builder) Zadania domowe i konkursy: Przygotować budowniczego labiryntu, który zamiast tworzyć labirynt jedynie liczy komórki i drzwi, a na końcu wyświetla uzyskane liczby. W C++ nie można ukryć klas tworzących tzw. wewnętrzną reprezentację, ale można zablokować ich użycie inaczej niż poprzez budowniczego. Zrób to (konkurs). W hołdzie Pratchettowi przygotować budowniczego dla labiryntu złożonego z foremnych trójkątów na zamkniętym pasie. Użyć PBC w jednym kierunku (konkurs).

Metoda wytwórcza (Factory method) Założenia: W odróżnieniu od budowniczego chcemy zmieniać nie zawartość złożonego produktu, a móc wybierać między różnymi klasami produktu Cel: 1. Interfejs do tworzenia różnych produktów (ale bez tworzenia nowej klasy wytwórcy) 2. Możliwość rozszerzania o nowe typy produktów 3. Stworzenie wiele „wirtualnych konstruktorów” dla szczegółowych klas modelu

Metoda wytwórcza (Factory method) Implementacja: W klasie kontrolującej aplikację (u nas w kontrolerze) stworzymy metody tworzące elementy labiryntu i sam labirynt. Klasa zawierająca metody – Wytwórca. Można tworzyć klasy potomne Wytwórcy/Kontrolera zmieniając zasady gry i modyfikując elementy labiryntu Nazwy używane w kontekście tego wzorca: Kontroler – Creator, wytwórca StandardowyKontroler – Concrete creator Labirynt - Product StandardowyLabirynt – Concrete product

Metoda wytwórcza (Factory method) http://zenit.senecac.on.ca/wiki/index.php/Factory_Method

Fabryka abstrakcyjna (Abstract factory) Założenia: W odróżnieniu od budowniczego chcemy zmieniać nie zawartość złożonego produktu, a móc wybierać między różnymi klasami produktu Cel: 1. Zebranie metod wytwórczych dla rodziny produktu w jednej klasie (często singletonie) 2. Stworzenie interfejsu do tworzenia obiektów (fabryka abstrakcyjna) z możliwością jej nadpisywania w fabryce konkretnej

Fabryka abstrakcyjna (Abstract factory) Implementacja: Tworzymy nową klasę zawierającą zbiór metod wytwórczych tworzących poszczególne elementy labiryntu Nazwy używane w kontekście tego wzorca: FabrykaLabiryntu – Abstract factory StandardowaFabrykaLabiryntu – Concrete factory, fabryka konkretna Labirynt – Abstract product StandardowyLabirynt – Concrete product Kontroler – Client

Fabryka abstrakcyjna (Abstract factory) http://zenit.senecac.on.ca/wiki/index.php/Abstract_Factory

Rozkład MVC na proste wzorce Zob. pl wiki Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany