Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego u ytku
|
|
- Seweryna Dąbrowska
- 8 lat temu
- Przeglądów:
Transkrypt
1 Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego u ytku Autorzy: Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides T³umaczenie: Tomasz Walczak ISBN: Tytu³ orygina³u: Design Patterns: Elements of Reusable Object-Oriented Software Format: , stron: 376 Naucz siê wykorzystywaæ wzorce projektowe i u³atw sobie pracê! Jak wykorzystaæ projekty, które ju wczeœniej okaza³y siê dobre? Jak stworzyæ elastyczny projekt obiektowy? Jak sprawnie rozwi¹zywaæ typowe problemy projektowe? Projektowanie oprogramowania obiektowego nie jest ³atwe, a przy za³o eniu, e powinno ono nadawaæ siê do wielokrotnego u ytku, staje siê naprawdê skomplikowane. Aby stworzyæ dobry projekt, najlepiej skorzystaæ ze sprawdzonych i efektywnych rozwi¹zañ, które wczeœniej by³y ju stosowane. W tej ksi¹ ce znajdziesz w³aœnie najlepsze doœwiadczenia z obszaru programowania obiektowego, zapisane w formie wzorców projektowych gotowych do natychmiastowego u ycia! W ksi¹ ce Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego u ytku opisano, czym s¹ wzorce projektowe, a tak e w jaki sposób pomagaj¹ one projektowaæ oprogramowanie obiektowe. Podrêcznik zawiera studia przypadków, pozwalaj¹ce poznaæ metody stosowania wzorców w praktyce. Zamieszczono tu równie katalog wzorców projektowych, podzielony na trzy kategorie: wzorce konstrukcyjne, strukturalne i operacyjne. Dziêki temu przewodnikowi nauczysz siê skutecznie korzystaæ z wzorców projektowych, ulepszaæ dokumentacjê i usprawniaæ konserwacjê istniej¹cych systemów. Krótko mówi¹c, poznasz najlepsze sposoby sprawnego opracowywania niezawodnego projektu. Wzorce projektowe w architekturze MVC Katalog wzorców projektowych Projektowanie edytora dokumentów Wzorce konstrukcyjne, strukturalne i operacyjne Dziedziczenie klas i interfejsów Okreœlanie implementacji obiektów Obs³uga wielu standardów wygl¹du i dzia³ania Zastosowanie mechanizmów powtórnego wykorzystania rozwi¹zania Wykorzystaj zestaw konkretnych narzêdzi do programowania obiektowego!
2 SPIS TREŚCI Przedmowa... 9 Wstęp Przewodnik dla Czytelników Rozdział 1. Wprowadzenie Czym jest wzorzec projektowy? Wzorce projektowe w architekturze MVC w języku Smalltalk Opisywanie wzorców projektowych Katalog wzorców projektowych Struktura katalogu Jak wzorce pomagają rozwiązać problemy projektowe? Jak wybrać wzorzec projektowy? Jak stosować wzorce projektowe? Rozdział 2. Studium przypadku projektowanie edytora dokumentów Problemy projektowe Struktura dokumentu Formatowanie Ozdabianie interfejsu użytkownika Obsługa wielu standardów wyglądu i działania Obsługa wielu systemów okienkowych Działania użytkowników Sprawdzanie pisowni i podział słów Podsumowanie...86 Rozdział 3. Wzorce konstrukcyjne BUDOWNICZY (BUILDER)...92 FABRYKA ABSTRAKCYJNA (ABSTRACT FACTORY) METODA WYTWÓRCZA PROTOTYP (PROTOTYPE) SINGLETON (SINGLETON) Omówienie wzorców konstrukcyjnych
3 8 SPIS TREŚCI Rozdział 4. Wzorce strukturalne ADAPTER (ADAPTER) DEKORATOR (DECORATOR) FASADA (FACADE) KOMPOZYT (COMPOSITE) MOST (BRIDGE) PEŁNOMOCNIK (PROXY) PYŁEK (FLYWEIGHT) Omówienie wzorców strukturalnych Rozdział 5. Wzorce operacyjne INTERPRETER (INTERPRETER) ITERATOR (ITERATOR) ŁAŃCUCH ZOBOWIĄZAŃ (CHAIN OF RESPONSIBILITY) MEDIATOR (MEDIATOR) METODA SZABLONOWA (TEMPLATE METHOD) OBSERWATOR (OBSERVER) ODWIEDZAJĄCY (VISITOR) PAMIĄTKA (MEMENTO) POLECENIE (COMMAND) STAN (STATE) STRATEGIA (STRATEGY) Omówienie wzorców operacyjnych Rozdział 6. Podsumowanie Czego można oczekiwać od wzorców projektowych? Krótka historia Społeczność związana ze wzorcami Zaproszenie Słowo na zakończenie Dodatek A Słowniczek Dodatek B Przewodnik po notacji B.1. Diagram klas B.2. Diagram obiektów B.3. Diagram interakcji Dodatek C Klasy podstawowe C.1. List C.2. Iterator C.3. ListIterator C.4. Point C.5. Rect Bibliografia Skorowidz
4 ROZDZIAŁ 3. Wzorce konstrukcyjne Konstrukcyjne wzorce projektowe pozwalają ująć w abstrakcyjnej formie proces tworzenia egzemplarzy klas. Pomagają zachować niezależność systemu od sposobu tworzenia, składania i reprezentowania obiektów. Klasowe wzorce konstrukcyjne są oparte na dziedziczeniu i służą do modyfikowania klas, których egzemplarze są tworzone. W obiektowych wzorcach konstrukcyjnych tworzenie egzemplarzy jest delegowane do innego obiektu. Wzorce konstrukcyjne zyskują na znaczeniu wraz z coraz częstszym zastępowaniem w systemach dziedziczenia klas składaniem obiektów. Powoduje to, że programiści kładą mniejszy nacisk na trwałe zapisywanie w kodzie określonego zestawu zachowań, a większy na definiowanie mniejszego zbioru podstawowych działań, które można połączyć w dowolną liczbę bardziej złożonych zachowań. Dlatego tworzenie obiektów o określonych zachowaniach wymaga czegoś więcej niż prostego utworzenia egzemplarza klasy. We wzorcach z tego rozdziału powtarzają się dwa motywy. Po pierwsze, wszystkie te wzorce kapsułkują informacje o tym, z których klas konkretnych korzysta system. Po drugie, ukrywają proces tworzenia i składania egzemplarzy tych klas. System zna tylko interfejsy obiektów zdefiniowane w klasach abstrakcyjnych. Oznacza to, że wzorce konstrukcyjne dają dużą elastyczność w zakresie tego, co jest tworzone, kto to robi, jak przebiega ten proces i kiedy ma miejsce. Umożliwiają skonfigurowanie systemu z obiektami-produktami o bardzo zróżnicowanych strukturach i funkcjach. Konfigurowanie może przebiegać statycznie (w czasie kompilacji) lub dynamicznie (w czasie wykonywania programu). Niektóre wzorce konstrukcyjne są dla siebie konkurencją. Na przykład w niektórych warunkach można z pożytkiem zastosować zarówno wzorzec Prototyp (s. 120), jak i Fabryka abstrakcyjna (s. 101). W innych przypadkach wzorce się uzupełniają. We wzorcu Budowniczy (s. 92) można wykorzystać jeden z pozostałych wzorców do określenia, które komponenty zostaną zbudowane, a do zaimplementowania wzorca Prototyp (s. 120) można użyć wzorca Singleton (s. 130). Ponieważ wzorce konstrukcyjne są mocno powiązane ze sobą, przeanalizujemy całą ich piątkę razem, aby podkreślić podobieństwa i różnice między nimi. Wykorzystamy też jeden przykład do zilustrowania implementacji tych wzorców tworzenie labiryntu na potrzeby gry komputerowej. Labirynt i gra będą nieco odmienne w poszczególnych wzorcach. Czasem celem gry będzie po prostu znalezienie wyjścia z labiryntu. W tej wersji gracz prawdopodobnie będzie
5 88 Rozdział 3. WZORCE KONSTRUKCYJNE widział tylko lokalny fragment labiryntu. Czasem w labiryntach trzeba będzie rozwiązać problemy i poradzić sobie z zagrożeniami. W tych odmianach można udostępnić mapę zbadanego już fragmentu labiryntu. Pominiemy wiele szczegółów dotyczących tego, co może znajdować się w labiryncie i czy gra jest jedno-, czy wieloosobowa. Zamiast tego skoncentrujemy się na tworzeniu labiryntów. Labirynt definiujemy jako zbiór pomieszczeń. Każde z nich ma informacje o sąsiadach. Mogą to być następne pokoje, ściana lub drzwi do innego pomieszczenia. Klasy Room, Door i Wall reprezentują komponenty labiryntu używane we wszystkich przykładach. Definiujemy tylko fragmenty tych klas potrzebne do utworzenia labiryntu. Ignorujemy graczy, operacje wyświetlania labiryntu i poruszania się po nim oraz inne ważne funkcje nieistotne przy generowaniu labiryntów. Poniższy diagram ilustruje relacje między wspomnianymi klasami: Każde pomieszczenie ma cztery strony. W implementacji w języku C++ do określania stron północnej, południowej, wschodniej i zachodniej służy typ wyliczeniowy Direction: enum Direction {North, South, East, West; W implementacji w języku Smalltalk kierunki te są reprezentowane za pomocą odpowiednich symboli. MapSite to klasa abstrakcyjna wspólna dla wszystkich komponentów labiryntu. Aby uprościć przykład, zdefiniowaliśmy w niej tylko jedną operację Enter. Jej działanie zależy od tego, gdzie gracz wchodzi. Jeśli jest to pomieszczenie, zmienia się lokalizacja gracza. Jeżeli są to drzwi, mogą zajść dwa zdarzenia jeśli są otwarte, gracz przejdzie do następnego pokoju, a o zamknięte drzwi użytkownik rozbije sobie nos. class MapSite { public: virtual void Enter() = 0; ; Enter to prosty podstawowy element bardziej złożonych operacji gry. Na przykład jeśli gracz znajduje się w pomieszczeniu i zechce pójść na wschód, gra może ustalić, który obiekt MapSite znajduje się w tym kierunku, i wywołać operację Enter tego obiektu. Operacja Enter specyficzna
6 WZORCE KONSTRUKCYJNE 89 dla podklasy określi, czy gracz zmienił lokalizację czy rozbił sobie nos. W prawdziwej grze operacja Enter mogłaby przyjmować jako argument obiekt reprezentujący poruszającego się gracza. Room to podklasa konkretna klasy MapSite określająca kluczowe relacje między komponentami labiryntu. Przechowuje referencje do innych obiektów MapSite i numer pomieszczenia (numery te służą do identyfikowania pokojów w labiryncie). class Room : public MapSite { public: Room(int roomno); MapSite* GetSide(Direction) const; void SetSide(Direction, MapSite*); virtual void Enter(); private: MapSite* _sides[4]; int _roomnumber; ; Poniższe klasy reprezentują ścianę i drzwi umieszczone po dowolnej stronie pomieszczenia. class Wall : public MapSite { public: Wall(); virtual void Enter(); ; class Door : public Mapsite { public: Door(Room* = 0, Room* = 0); virtual void Enter(); Room* OtherSideFrom(Room*); private: Room* _room1; Room* _room2; bool _isopen; ; Potrzebne są informacje nie tylko o częściach labiryntu. Zdefiniujemy też klasę Maze reprezentującą kolekcję pomieszczeń. Klasa ta udostępnia operację RoomNo, która znajduje określony pokój po otrzymaniu jego numeru. class Mase { public: Maze(); void AddRoom(Room*);
7 90 Rozdział 3. WZORCE KONSTRUKCYJNE Room* RoomNo(int) const; private: //... ; Operacja RoomNo może znajdować pomieszczenia za pomocą wyszukiwania liniowego, tablicy haszującej lub prostej tablicy. Nie będziemy jednak zajmować się takimi szczegółami. Zamiast tego skoncentrujmy się na tym, jak określić komponenty obiektu Maze. Następną klasą, jaką zdefiniujemy, jest MazeGame. Służy ona do tworzenia labiryntu. Prostym sposobem na wykonanie tego zadania jest użycie serii operacji dodających komponenty do labiryntu i łączących je. Na przykład poniższa funkcja składowa utworzy labirynt składający się z dwóch pomieszczeń rozdzielonych drzwiami: Maze* MazeGame::CreateMaze () { Maze* amaze = new Maze; Room* r1 = new Room(1); Room* r2 = new Room(2); Door* thedoor = new Door(r1, r2); amaze->addroom(r1); amaze->addroom(r2); r1->setside(north, new Wall); r1->setside(east, thedoor); r1->setside(south, new Wall); r1->setside(west, new Wall); r2->setside(north, new Wall); r2->setside(east, new Wall); r2->setside(south, new Wall); r2->setside(west, thedoor); return amaze; Funkcja ta jest stosunkowo skomplikowana, jeśli weźmiemy pod uwagę, że jedyne, co robi, to tworzy labirynt składający się z dwóch pomieszczeń. Można łatwo wymyślić sposób na uproszczenie tej funkcji. Na przykład konstruktor klasy Room mógłby inicjować pokój przez przypisanie ścian do jego stron. Jednak to rozwiązanie powoduje jedynie przeniesienie kodu w inne miejsce. Prawdziwy problem związany z tą funkcją składową nie jest związany z jej rozmiarem, ale z brakiem elastyczności. Powoduje ona zapisanie na stałe układu labiryntu. Zmiana tego układu wymaga zmodyfikowania omawianej funkcji składowej. Można to zrobić albo przez jej przesłonięcie (co oznacza ponowną implementację całego kodu), albo przez zmodyfikowanie jej fragmentów (to podejście jest narażone na błędy i nie sprzyja ponownemu wykorzystaniu rozwiązania). Wzorce konstrukcyjne pokazują, jak zwiększyć elastyczność projektu. Nie zawsze oznacza to zmniejszenie samego projektu. Wzorce te przede wszystkim ułatwiają modyfikowanie klas definiujących komponenty labiryntu.
8 WZORCE KONSTRUKCYJNE WZORCE KONSTRUKCYJNE 91 Załóżmy, że chcemy powtórnie wykorzystać układ labiryntu w nowej grze obejmującej (między innymi) magiczne labirynty. Potrzebne będą w niej nowe rodzaje komponentów, takie jak DoorNeedingSpell (drzwi, które można zamknąć i następnie otworzyć tylko za pomocą czaru) i EnchantedRoom (pokój z niezwykłymi przedmiotami, na przykład magicznymi kluczami lub czarami). Jak można w łatwy sposób zmodyfikować operację CrateMaze, aby tworzyła labirynty z obiektami nowych klas? W tym przypadku największa przeszkoda związana jest z zapisaniem na stałe klas, których egzemplarze tworzy opisywana operacja. Wzorce konstrukcyjne udostępniają różne sposoby usuwania bezpośrednich referencji do klas konkretnych z kodu, w którym trzeba tworzyć egzemplarze takich klas: Jeśli operacja CreateMaze przy tworzeniu potrzebnych pomieszczeń, ścian i drzwi wywołuje funkcje wirtualne zamiast konstruktora, można zmienić klasy, których egzemplarze powstają, przez utworzenie podklasy klasy MazeGame i ponowne zdefiniowanie funkcji wirtualnych. To rozwiązanie to przykład zastosowania wzorca Metoda wytwórcza (s. 110). Jeśli operacja CreateMaze otrzymuje jako parametr obiekt, którego używa do tworzenia pomieszczeń, ścian i drzwi, można zmienić klasy tych komponentów przez przekazanie nowych parametrów. Jest to przykład zastosowania wzorca Fabryka abstrakcyjna (s. 101). Jeśli operacja CreateMaze otrzymuje obiekt, który potrafi utworzyć cały nowy labirynt za pomocą operacji dodawania pomieszczeń, drzwi i ścian, można zastosować dziedziczenie do zmodyfikowania fragmentów labiryntu lub sposobu jego powstawania. W ten sposób działa wzorzec Budowniczy (s. 92). Jeśli operacja CreateMaze jest sparametryzowana za pomocą różnych prototypowych obiektów reprezentujących pomieszczenia, drzwi i ściany, które kopiuje i dodaje do labiryntu, można zmienić układ labiryntu przez zastąpienie danych obiektów prototypowych innymi. Jest to przykład zastosowania wzorca Prototyp (s. 120). Ostatni wzorzec konstrukcyjny, Singleton (s. 130), pozwala zagwarantować, że w grze powstanie tylko jeden labirynt, a wszystkie obiekty gry będą mogły z niego korzystać (bez uciekania się do stosowania zmiennych lub funkcji globalnych). Wzorzec ten ułatwia też rozbudowywanie lub zastępowanie labiryntów bez modyfikowania istniejącego kodu.
9 92 Rozdział 3. WZORCE KONSTRUKCYJNE BUDOWNICZY (BUILDER) obiektowy, konstrukcyjny PRZEZNACZENIE Oddziela tworzenie złożonego obiektu od jego reprezentacji, dzięki czemu ten sam proces konstrukcji może prowadzić do powstawania różnych reprezentacji. UZASADNIENIE Czytnik dokumentów w formacie RTF (ang. Rich Text Format) powinien móc przekształcać takie dokumenty na wiele formatów tekstowych. Takie narzędzie mogłoby przeprowadzać konwersję dokumentów RTF na zwykły tekst w formacie ASCII lub na widget tekstowy, który można interaktywnie edytować. Jednak problem polega na tym, że liczba możliwych przekształceń jest nieokreślona. Dlatego należy zachować możliwość łatwego dodawania nowych metod konwersji bez konieczności modyfikowania czytnika. Rozwiązanie polega na skonfigurowaniu klasy RTFReader za pomocą obiektu TextConverter przekształcającego dokumenty RTF na inną reprezentację tekstową. Klasa RTFReader w czasie analizowania dokumentu RTF korzysta z obiektu TextConverter do przeprowadzania konwersji. Kiedy klasa RTFReader wykryje znacznik formatu RTF (w postaci zwykłego tekstu lub słowa sterującego z tego formatu), przekaże do obiektu TextConverter żądanie przekształcenia znacznika. Obiekty TextConverter odpowiadają zarówno za przeprowadzanie konwersji danych, jak i zapisywanie znacznika w określonym formacie. Podklasy klasy TextConverter są wyspecjalizowane pod kątem różnych konwersji i formatów. Na przykład klasa ASCIIConverter ignoruje żądania związane z konwersją elementów innych niż zwykły tekst. Z kolei klasa TeXConverter obejmuje implementację operacji obsługujących wszystkie żądania, co umożliwia utworzenie reprezentacji w formacie TEX, uwzględniającej wszystkie informacje na temat stylu tekstu. Klasa TextWidgetConverter generuje złożony obiekt interfejsu użytkownika umożliwiający oglądanie i edytowanie tekstu.
10 BUDOWNICZY (BUILDER) 93 Każda klasa konwertująca przyjmuje mechanizm tworzenia i składania obiektów złożonych oraz ukrywa go za abstrakcyjnym interfejsem. Konwerter jest oddzielony od czytnika odpowiadającego za analizowanie dokumentów RTF. Wzorzec Budowniczy ujmuje wszystkie te relacje. W tym wzorcu każda klasa konwertująca nosi nazwę builder (czyli budowniczy), a klasa czytnika to director (czyli kierownik). Zastosowanie wzorca Budowniczy w przytoczonym przykładzie powoduje oddzielenie algorytmu interpretującego format tekstowy (czyli parsera dokumentów RTF) od procesu tworzenia i reprezentowania przekształconego dokumentu. Umożliwia to powtórne wykorzystanie algorytmu analizującego z klasy RTFReader do przygotowania innych reprezentacji tekstu z dokumentów RTF. Aby to osiągnąć, wystarczy skonfigurować klasę RTFReader za pomocą innej podklasy klasy TextConverter. WARUNKI STOSOWANIA Wzorca Budowniczy należy używać w następujących sytuacjach: Jeśli algorytm tworzenia obiektu złożonego powinien być niezależny od składników tego obiektu i sposobu ich łączenia. Kiedy proces konstrukcji musi umożliwiać tworzenie różnych reprezentacji generowanego obiektu. STRUKTURA ELEMENTY Builder (TextConverter), czyli budowniczy: określa interfejs abstrakcyjny do tworzenia składników obiektu Product. ConcreteBuilder (ASCIIConverter, TeXConverter, TextWidgetConverter), czyli budowniczy konkretny: tworzy i łączy składniki produktu w implementacji interfejsu klasy Builder; definiuje i śledzi generowane reprezentacje; udostępnia interfejs do pobierania produktów (na przykład operacje GetASCIIText i GetTextWidget).
11 94 Rozdział 3. WZORCE KONSTRUKCYJNE Director (RTFReader), czyli kierownik: tworzy obiekt za pomocą interfejsu klasy Builder. Product (ASCIIText, TeXText, TextWidget): reprezentuje generowany obiekt złożony; klasa ConcreteBuilder tworzy wewnętrzną reprezentację produktu i definiuje proces jej składania; obejmuje klasy definiujące składowe elementy obiektu, w tym interfejsy do łączenia składowych w ostateczną postać obiektu. WSPÓŁDZIAŁANIE Klient tworzy obiekt Director i konfiguruje go za pomocą odpowiedniego obiektu Builder. Kiedy potrzebne jest utworzenie części produktu, obiekt Director wysyła powiadomienie do obiektu Builder. Obiekt Builder obsługuje żądania od obiektu Director i dodaje części do produktu. Klient pobiera produkt od obiektu Builder. Poniższy diagram interakcji pokazuje, w jaki sposób klasy Builder i Director współdziałają z klientem. KONSEKWENCJE Oto kluczowe konsekwencje zastosowania wzorca Budowniczy: 1. Możliwość modyfikowania wewnętrznej reprezentacji produktu. Obiekt Builder udostępnia obiektowi Director interfejs abstrakcyjny do tworzenia produktu. Interfejs ten umożliwia obiektowi Builder ukrycie reprezentacji i wewnętrznej struktury produktu, a także sposobu jego składania. Ponieważ do tworzenia produktu służy interfejs abstrakcyjny, zmiana wewnętrznej reprezentacji produktu wymaga jedynie zdefiniowania obiektu Builder nowego rodzaju.
12 BUDOWNICZY (BUILDER) Odizolowanie reprezentacji od kodu służącego do tworzenia produktu. Wzorzec Budowniczy pomaga zwiększyć modularność, ponieważ kapsułkuje sposób tworzenia i reprezentowania obiektu złożonego. Klienty nie potrzebują żadnych informacji o klasach definiujących wewnętrzną strukturę produktu, ponieważ klasy te nie występują w interfejsie obiektu Builder. Każdy obiekt ConcreteBuilder obejmuje cały kod potrzebny do tworzenia i składania produktów określonego rodzaju. Kod ten wystarczy napisać raz. Następnie można wielokrotnie wykorzystać go w różnych obiektach Director do utworzenia wielu odmian obiektu Product za pomocą tych samych składników. W przykładzie dotyczącym dokumentów RTF moglibyśmy zdefiniować czytnik dokumentów o formacie innym niż RTF, na przykład klasę SGMLReader, i użyć tych samych podklas klasy TextConverter do wygenerowania reprezentacji dokumentów SGML w postaci obiektów ASCIIText, TeXText i TextWidget. 3. Większa kontrola nad procesem tworzenia. Wzorzec Budowniczy w odróżnieniu od wzorców konstrukcyjnych tworzących produkty w jednym etapie polega na generowaniu ich krok po kroku pod kontrolą obiektu Director. Dopiero po ukończeniu produktu obiekt Director odbiera go od obiektu Builder. Dlatego interfejs klasy Builder w większym stopniu niż inne wzorce konstrukcyjne odzwierciedla proces tworzenia produktów. Zapewnia to pełniejszą kontrolę nad tym procesem, a tym samym i wewnętrzną strukturą gotowego produktu. IMPLEMENTACJA Zwykle w implementacji znajduje się klasa abstrakcyjna Builder obejmująca definicję operacji dla każdego komponentu, którego utworzenia może zażądać obiekt Director. Domyślnie operacje te nie wykonują żadnych działań. W klasie ConcreteBuilder przesłonięte są operacje komponentów, które klasa ta ma generować. Oto inne związane z implementacją kwestie, które należy rozważyć: 1. Interfejs do składania i tworzenia obiektów. Obiekty Builder tworzą produkty krok po kroku. Dlatego interfejs klasy Builder musi być wystarczająco ogólny, aby umożliwiał konstruowanie produktów każdego rodzaju przez konkretne podklasy klasy Builder. Kluczowa kwestia projektowa dotyczy modelu procesu tworzenia i składania obiektów. Zwykle wystarczający jest model, w którym efekty zgłoszenia żądania konstrukcji są po prostu dołączane do produktu. W przykładzie związanym z dokumentami RTF obiekt Builder przekształca i dołącza następny znacznik do wcześniej skonwertowanego tekstu. Jednak czasem potrzebny jest dostęp do wcześniej utworzonych części produktu. W przykładzie dotyczącym labiryntów, który prezentujemy w punkcie Przykładowy kod, interfejs klasy MazeBuilder umożliwia dodanie drzwi między istniejącymi pomieszczeniami. Następnym przykładem, w którym jest to potrzebne, są budowane od dołu do góry struktury drzewiaste, takie jak drzewa składni. Wtedy obiekt Builder zwraca węzły podrzędne obiektowi Director, który następnie przekazuje je ponownie do obiektu Builder, aby ten utworzył węzły nadrzędne.
13 96 Rozdział 3. WZORCE KONSTRUKCYJNE 2. Dlaczego nie istnieje klasa abstrakcyjna produktów? W typowych warunkach produkty tworzone przez obiekty ConcreteBuilder mają tak odmienną reprezentację, że udostępnienie wspólnej klasy nadrzędnej dla różnych produktów przynosi niewielkie korzyści. W przykładzie dotyczącym dokumentów RTF obiekty ASCIIText i TextWidget prawdopodobnie nie będą miały wspólnego interfejsu ani też go nie potrzebują. Ponieważ klienty zwykle konfigurują obiekt Director za pomocą odpowiedniego obiektu ConcreteBuilder, klient potrafi określić, która podklasa konkretna klasy Builder jest używana, i na tej podstawie obsługuje dostępne produkty. 3. Zastosowanie pustych metod domyślnych w klasie Builder. W języku C++ metody służące do tworzenia obiektów celowo nie są deklarowane jako czysto wirtualne funkcje składowe. W zamian definiuje się je jako puste metody, dzięki czemu w klientach trzeba przesłonić tylko potrzebne operacje. PRZYKŁADOWY KOD Zdefiniujmy nową wersję funkcji składowej CreateMaze (s. 90). Będzie ona przyjmować jako argument obiekt budujący klasy MazeBuilder. Klasa MazeBuilder definiuje poniższy interfejs służący do tworzenia labiryntów: class MazeBuilder { public: virtual void BuildMaze() { virtual void BuildRoom(int room) { virtual void BuildDoor(int roomfrom, int roomto) { virtual Maze* GetMaze() { return 0; protected: MazeBuilder(); ; Ten interfejs pozwala utworzyć trzy elementy: (1) labirynt, (2) pomieszczenia o określonym numerze i (3) drzwi między ponumerowanymi pokojami. Operacja GetMaze zwraca labirynt klientowi. W podklasach klasy MazeBuilder należy ją przesłonić, aby zwracały one generowany przez siebie labirynt. Wszystkie związane z budowaniem labiryntu operacje klasy MazeBuilder domyślnie nie wykonują żadnych działań. Jednak nie są zadeklarowane jako czysto wirtualne, dzięki czemu w klasach pochodnych wystarczy przesłonić tylko potrzebne metody. Po utworzeniu interfejsu klasy MazeBuilder można zmodyfikować funkcję składową CreateMaze, aby przyjmowała jako parametr obiekt tej klasy: Maze* MazeGame::CreateMaze (MazeBuilder& builder) { builder.buildmaze(); builder.buildroom(1); builder.buildroom(2); builder.builddoor(1, 2); return builder.getmaze();
14 BUDOWNICZY (BUILDER) 97 Porównajmy tę wersję operacji CreateMaze z jej pierwowzorem. Warto zauważyć, w jaki sposób w budowniczym ukryto wewnętrzną reprezentację labiryntu czyli klasy z definicjami pomieszczeń, drzwi i ścian i jak elementy te są składane w gotowy labirynt. Można się domyślić, że istnieją klasy reprezentujące pomieszczenia i drzwi, jednak w kodzie nie ma wskazówek dotyczących klasy związanej ze ścianami. Ułatwia to zmianę reprezentacji labiryntu, ponieważ nie trzeba modyfikować kodu żadnego z klientów używających klasy MazeBuilder. Wzorzec Budowniczy podobnie jak inne wzorce konstrukcyjne kapsułkuje tworzenie obiektów. Tutaj służy do tego interfejs zdefiniowany w klasie MazeBuilder. Oznacza to, że możemy wielokrotnie wykorzystać tę klasę do tworzenia labiryntów różnego rodzaju. Przykładem na to jest operacja CreateComplexMaze: Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) { builder.buildroom(1); //... builder.buildroom(1001); return builder.getmaze(); Warto zauważyć, że klasa MazeBuilder nie tworzy labiryntu. Służy ona głównie do definiowania interfejsu do generowania labiryntów. Puste implementacje znajdują się w niej dla wygody programisty, natomiast potrzebne działania wykonują podklasy klasy MazeBuilder. Podklasa StandardMazeBuilder to implementacja służąca do tworzenia prostych labiryntów. Zapisuje ona budowany labirynt w zmiennej _currentmaze. class StandardMazeBuilder : public MazeBuilder { public: StandardMazeBuilder(); virtual void BuildMaze(); virtual void BuildRoom(int); virtual void BuildDoor(int, int); virtual Maze* GetMaze(); private: Direction CommonWall(Room*, Room*); Maze* _currentmaze; ; CommonWall to operacja narzędziowa określająca kierunek standardowej ściany pomiędzy dwoma pomieszczeniami. Konstruktor StandardMazeBuilder po prostu inicjuje zmienną _currentmaze. StandardMazeBuilder::StandardMazeBuilder () { _currentmaze = 0; Operacja BuildMaze tworzy egzemplarz klasy Maze, który pozostałe operacje składają i ostatecznie zwracają do klienta (za to odpowiada operacja GetMaze).
15 98 Rozdział 3. WZORCE KONSTRUKCYJNE void StandardMazeBuilder::BuildMaze () { _currentmaze = new Maze; Maze* StandardMazeBuilder::GetMaze () { return _currentmaze; Operacja BuildRoom tworzy pomieszczenie i ściany wokół niego. void StandardMazeBuilder::BuildRoom (int n) { if (!_currentmaze->roomno(n)) { Room* room = new Room(n); _currentmaze->addroom(room); room->setside(north, new Wall); room->setside(south, new Wall); room->setside(east, new Wall); room->setside(west, new Wall); Aby utworzyć drzwi między dwoma pomieszczeniami, obiekt StandardMazeBuilder wyszukuje w labiryncie odpowiednie pokoje i łączącą je ścianę. void StandardMazeBuilder::BuildDoor (int n1, int n2) { Room* r1 = _currentmaze->roomno(n1); Room* r2 = _currentmaze->roomno(n2); Door* d = new Door(r1, r2); r1->setside(commonwall(r1,r2), d); r2->setside(commonwall(r2,r1), d); Klienty mogą teraz użyć do utworzenia labiryntu operacji CreateMaze wraz z obiektem StandardMazeBuilder. Maze* maze; MazeGame game; StandardMazeBuilder builder; game.createmaze(builder); maze = builder.getmaze(); Moglibyśmy umieścić wszystkie operacje klasy StandardMazeBuilder w klasie Maze i pozwolić każdemu obiektowi Maze, aby samodzielnie utworzył swój egzemplarz. Jednak zmniejszenie klasy Maze sprawia, że łatwiej będzie ją zrozumieć i zmodyfikować, a wyodrębnienie z niej klasy StandardMazeBuilder nie jest trudne. Co jednak najważniejsze, rozdzielenie tych klas pozwala utworzyć różnorodne obiekty z rodziny MazeBuilder, z których każdy używa innych klas do generowania pomieszczeń, ścian i drzwi.
16 BUDOWNICZY (BUILDER) 99 CountingMazeBuilder to bardziej wymyślna podklasa klasy MazeBuilder. Budowniczowie tego typu w ogóle nie tworzą labiryntów, a jedynie zliczają utworzone komponenty różnych rodzajów. class CountingMazeBuilder : public MazeBuilder { public: CountingMazeBuilder(); virtual void BuildMaze(); virtual void BuildRoom(int); virtual void BuildDoor(int, int); virtual void AddWall(int, Direction); void GetCounts(int&, int&) const; private: int _doors; int _rooms; ; Konstruktor inicjuje liczniki, a przesłonięte operacje klasy MazeBuilder w odpowiedni sposób powiększają ich wartość. CountingMazeBuilder::CountingMazeBuilder () { _rooms = _doors = 0; void CountingMazeBuilder::BuildRoom (int) { _rooms++; void CountingMazeBuilder::BuildDoor (int, int) { _doors++; void CountingMazeBuilder::GetCounts ( int& rooms, int& doors ) const { rooms = _rooms; doors = _doors; Klient może korzystać z klasy CountingMazeBuilder w następujący sposób: int rooms, doors; MazeGame game; CountingMazeBuilder builder; game.createmaze(builder); builder.getcounts(rooms, doors); cout << "Liczba pomieszczeń w labiryncie to " << rooms << ", a liczba drzwi wynosi " << doors << "." «endl;
17 100 Rozdział 3. WZORCE KONSTRUKCYJNE ZNANE ZASTOSOWANIA Aplikacja do konwersji dokumentów RTF pochodzi z platformy ET++ [WGM88]. Jej część służąca do obsługi tekstu wykorzystuje budowniczego do przetwarzania tekstu zapisanego w formacie RTF. Wzorzec Budowniczy jest często stosowany w języku Smalltalk-80 [Par90]: Klasa Parser w podsystemie odpowiedzialnym za kompilację pełni funkcję kierownika i przyjmuje jako argument obiekt ProgramNodeBuilder. Obiekt Parser za każdym razem, kiedy rozpozna daną konstrukcję składniową, wysyła do powiązanego z nim obiektu ProgramNodeBuilder powiadomienie. Kiedy parser kończy działanie, żąda od budowniczego utworzenia drzewa składni i przekazuje je klientowi. ClassBuilder to budowniczy, którego klasy używają do tworzenia swoich podklas. W tym przypadku klasa jest zarówno kierownikiem, jak i produktem. ByteCodeStream to budowniczy, który tworzy skompilowaną metodę w postaci tablicy bajtów. Klasa ByteCodeStream to przykład niestandardowego zastosowania wzorca Budowniczy, ponieważ generowany przez nią obiekt złożony jest kodowany jako tablica bajtów, a nie jako zwykły obiekt języka Smalltalk. Jednak interfejs klasy ByteCodeStream jest typowy dla budowniczych i łatwo można zastąpić tę klasą inną, reprezentującą programy jako obiekty składowe. Platforma Service Configurator wchodząca w skład środowiska Adaptive Communications Environment korzysta z budowniczych do tworzenia komponentów usług sieciowych dołączanych do serwera w czasie jego działania [SS94]. Komponenty te są opisane w języku konfiguracyjnym analizowanym przez parser LALR(1). Akcje semantyczne parsera powodują wykonanie operacji na budowniczym, który dodaje informacje do komponentu usługowego. W tym przykładzie parser pełni funkcję kierownika. POWIĄZANE WZORCE Fabryka abstrakcyjna (s. 101) przypomina wzorzec Budowniczy, ponieważ też może służyć do tworzenia obiektów złożonych. Główna różnica między nimi polega na tym, że wzorzec Budowniczy opisuje przede wszystkim tworzenie obiektów złożonych krok po kroku. We wzorcu Fabryka abstrakcyjna nacisk położony jest na rodziny obiektów-produktów (zarówno prostych, jak i złożonych). Budowniczy zwraca produkt w ostatnim kroku, natomiast we wzorcu Fabryka abstrakcyjna produkt jest udostępniany natychmiast. Budowniczy często służy do tworzenia kompozytów (s. 170).
Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35
Wzorce projektowe cz. II Wzorce projektowe cz. II 1/35 Wzorce projektowe cz. II 2/35 Iterator Przeznaczenie Wzorzec zapewnia sekwencyjny dostęp do elementów obiektu zagregowanego bez ujawniania jego reprezentacji
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Wzorce projektowe Wzorzec projektowy (ang. design pattern) w inżynierii oprogramowania, rozwiązanie często pojawiających się, powtarzalnych problemów projektowych.
Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz
Wzorce projektowe ArrayList DataGridView Aplikacja i zdarzenia Paweł Chodkiewicz Wzorzec uniwersalne rozwiązanie często powtarzających się problemów. Wzorzec opisuje problem, który powtarza się wielokrotnie
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Builder (budowniczy) Cel: Przykład:
1/8 Builder (budowniczy) Cel: Oddzielenie konstruowania złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstrukcji mógł tworzyć różne reprezentacje. Przykład: 2/8 abstract class TableBuilder
Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)
Analiza i projektowanie obiektowe 2016/2017 Wykład 11: Zaawansowane wzorce projektowe (1) Jacek Marciniak Wydział Matematyki i Informatyki Uniwersytet im. Adama Mickiewicza 1 Plan wykładu 1. Wzorce projektowe
Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?
Problemy projektowania obiektowego Czy podobne problemy można rozwiązywac w podobny sposób? Czy te problemy można przedstawić w abstrakcyjny sposób, tak aby były pomocne w tworzeniu rozwiązań w różnych
Wprowadzenie do programowania aplikacji mobilnych
Wprowadzenie do programowania aplikacji mobilnych dr Przemysław Juszczuk dr Przemysław Juszczuk Trochę historii Idea wzorców projektowych wywodzi się jeszcze z wczesnych lat osiemdziesiątych ubiegłego
Wzorce projektowe Michał Węgorek
Wzorce projektowe Michał Węgorek Wzorce projektowe Plan prezentacji Co to jest i po co to jest? Podział Najczęściej spotykane wzorce Bibliografia Co to jest i po co to jest? Wzorzec projektowy (ang. Design
Projektowanie obiektowe Wzorce projektowe
Projektowanie obiektowe Wzorce projektowe Gang of Four Kreacyjne wzorce projektowe (wzorce konstrukcyjne) 1 Roadmap Memento Factory Method Abstract Factory Prototype Builder 2 Wzorce konstrukcyjne wzorce
Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33
Wzorce projektowe cz. I Wzorce projektowe cz. I 1/33 Wzorce projektowe cz. I 2/33 Historia Wzorce projektowe: wywodzą się z wzorców projektowych w architekturze termin wzorca projektowego wprowadzony do
Zaawansowane programowanie obiektowe - wykład 5
Zaawansowane programowanie obiektowe - wykład 5 dr Piotr Jastrzębski (czynnościowe) opisują zachowanie obiektów, komunikację pomiędzy nimi i ich odpowiedzialność. Interpreter Iterator (kursor) Łańcuch
Testowanie oprogramowania Wzorce projektowe
Testowanie oprogramowania Wzorce projektowe 1/66 Testowanie oprogramowania Wzorce projektowe dr inż. Grzegorz Michalski 17 listopada 2015 Testowanie oprogramowania Wzorce projektowe 2/66 Plan wykładu Agenda
Programowanie obiektowe
Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce
Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton
Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu
problem w określonym kontekście siły istotę jego rozwiązania
Wzorzec projektowy Christopher Alexander: Wzorzec to sprawdzona koncepcja, która opisuje problem powtarzający się wielokrotnie w określonym kontekście, działające na niego siły, oraz podaje istotę jego
Projektowanie obiektowe Wzorce projektowe. Wprowadzenie do wzorców projektowych
Projektowanie obiektowe Wzorce projektowe Wprowadzenie do wzorców projektowych 1 Zagadnienia Katalog wzorców projektowych wg Gang of Four Zasady projektowania obiektowego S O L I D MVC - Model-Widok-Kontroler
Technologia Programowania 2016/2017 Wykład 5
Technologia Programowania 2016/2017 Wykład 5 Wzorce GoF Jakub Lemiesz Wzorce GoF Kreacyjne Builder Singleton Simple Factory Factory Method Abstract Factory Prototype Strukturalne Adapter Decorator Proxy
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Adapter - strukturalny wzorzec projektowy, którego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach - adapter przekształca interfejs
Technologia Programowania 2016/2017 Wykład 4
Technologia Programowania 2016/2017 Wykład 4 Wzorce projektowe GoF Jakub Lemiesz Wzorce GRASP a wzorce GoF Znamy 9 wzorców GRASP ogólne zasady Na GRASP opierają się klasyczne wzorce GoF Na wzorcach GoF
Wzorce projektowe i refaktoryzacja
Wzorce projektowe i refaktoryzacja Paweł Kozioł p.koziol@students.mimuw.edu.pl 18.01.2005 Moja praca magisterska Narzędzie dla środowiska Eclipse wspierające stosowanie wzorców projektowych J2EE Prowadzący:
Projektowanie oprogramowania: wzorce architektoniczne i projektowe
Projektowanie oprogramowania: wzorce architektoniczne i projektowe Ogólne zasady projektowania Nie staraj się zadziwić innych. Rzeczy oczywiste rób w sposób oczywisty. Nie rozmawiaj z nieznajomym. Projekt
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Iterator czynnościowy wzorzec projektowy (obiektowy), którego celem jest zapewnienie sekwencyjnego dostępu do podobiektów zgrupowanych w większym obiekcie (np.
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński
(wybrane) Wzorce projektowe Programowanie Obiektowe Mateusz Cicheński Kreacyjne Fabryka abstrakcyjna (Abstract Factory) Budowniczy (Builder) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton
(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński
(wybrane) Wzorce projektowe Programowanie Obiektowe Mateusz Cicheński Kreacyjne Fabryka abstrakcyjna (Abstract Factory) Budowniczy (Builder) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.
Adrian Skalczuk Szymon Kosarzycki Spis Treści Wstęp [1/2] Wzorce projektowe są nieodłącznym przyjacielem programisty pozwalają pisać czystszy kod, łatwiejszy do zrozumienia przez innych i zapewniają pewien
Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Wzorce projektowe kreacyjne
Wzorce projektowe kreacyjne Krzysztof Ciebiera 14 pa¹dziernika 2005 1 1 Wst p 1.1 Podstawy Opis Ogólny Podstawowe informacje Wzorce kreacyjne sªu» do uabstrakcyjniania procesu tworzenia obiektów. Znaczenie
Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń
Projektowanie obiektowe Wzorce projektowe Gang of Four Wzorce rozszerzeń 1 Roadmap Decorator Iterator Visitor 2 Wzorce rozszerzeń Mają na celu uczynić proces rozszerzania kodu bardziej czytelnym, prostym
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Wzorce oprogramowania Gof (cd) zastosowane w modelu obiektowym
Wzorce oprogramowania Gof (cd) (Gang of Four skrót odnoszący się do autorów ksiązki: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software)
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
Wypożyczalnia VIDEO. Technologie obiektowe
Wypożyczalnia VIDEO Jest to program do obsługi wypożyczalni i wypożyczeń klientów. Głównym zadaniem programu jest zarządzanie wypożyczeniami i drukowanie potwierdzenia wypożyczenia oraz naliczenie punktów
Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32
Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:
Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce odpowiedzialności
Projektowanie obiektowe Wzorce projektowe Gang of Four Wzorce odpowiedzialności 1 Roadmap Singleton Observer Mediator Proxy Flyweight 2 Wzorce odpowiedzialności Udostępniają techniki centralizacji, delegowania
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016 1 Wzorce strukturalne 1.1 Facade Motto: uproszczony interfejs dla podsystemu z wieloma interfejsami class SmtpFacade
WZORCE PROJEKTOWE (I) (DESIGN PATTERNS)
WZORCE PROJEKTOWE (I) (DESIGN PATTERNS) Maciej Patan Motywacje W wielu dziedzinach nowoczesnej inżynierii napotykamy na następujące zagadnienia: Czy typowe zadania i problemy można rozwiązywać w powtarzalny
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Programowanie obiektowe
Wykład 12 Marcin Młotkowski 16 maja 2018 Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 482 / 537 Dziedziczenie Dziedziczenie a składanie Plan wykładu 1 Analiza
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.
1/8 Singleton Cel: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. Przykład: Niekiedy ważne jest, aby tworzyć tylko jedną instancję jakiejś klasy. Globalne zmienne
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Listy powiązane zorientowane obiektowo
Listy powiązane zorientowane obiektowo Aby zilustrować potęgę polimorfizmu, przeanalizujmy zorientowaną obiektowo listę powiązaną. Jak zapewne wiesz, lista powiązana jest strukturą danych, zaprojektowaną
Wykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.
1/14 Prototype (prototyp) Cel: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp. Przykład: Edytor 3D klient tworzy obiekty różnych kształtów
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:
Zakres laboratorium: definiowanie struktur terminologia obiektowa definiowanie klas funkcje składowe klas programy złożone z wielu plików zadania laboratoryjne Laboratorium nr 12 Temat: Struktury, klasy.
Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014
Modelowanie diagramów klas w języku UML Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Czym jest UML - Unified Modeling Language - Rodzina języków modelowania graficznego - Powstanie na przełomie lat 80
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Programowanie w języku Java WYKŁAD
Programowanie w języku Java WYKŁAD dr inż. Piotr Zabawa Certyfikowany Konsultant IBM/Rational e-mail: pzabawa@pk.edu.pl www: http://www.pk.edu.pl/~pzabawa 24.02.2014 WYKŁAD 1 Wzorce projektowe Znaczenie
Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY
Różne właściwości Funkcje tak samo jak zmienne mają swoje miejsce w pamięci, gdzie są zapisane. Można więc uzyskać ich adres. Podobnie jak adres tablicy jest zwracany przez jej nazwę, podaną bez nawiasu
Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka
1 Omówienie wzorców wykorzystywanych w Prism 5.0 Dominika Różycka Czym jest wzorzec projektowy? 2 3 Wzorzec projektowy 1. Uniwersalne i sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych
Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)
Projektowanie obiektowe Wzorce projektowe Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów) 1 Roadmap Adapter Bridge Composite Facade 2 Pojęcia obiekt interfejs typ klasa 3 Co to jest delegacja?
Abstrakcyjny typ danych
Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/
Język programowania Andrzej Bobyk http://www.alfabeta.lublin.pl www.alfabeta.lublin.pl/jp/ Literatura K. Reisdorph: Delphi 6 dla każdego. Helion, Gliwice 2001 A. Grażyński, Z. Zarzycki: Delphi 7 dla każdego.
C++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Rysunkowy tutorial Możesz swobodnie dystrybuować ten plik jeśli pozostawisz go w nietkniętym stanie. Możesz także cytować jego fragmenty umieszczając w tekście odnośnik http://mbartyzel.blogspot.com Jak
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Szablony funkcji i szablony klas
Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument
Spis treści 1. Wstęp 2. Projektowanie systemów informatycznych
Spis treści 1. Wstęp... 9 1.1. Inżynieria oprogramowania jako proces... 10 1.1.1. Algorytm... 11 1.2. Programowanie w językach wysokiego poziomu... 11 1.3. Obiektowe podejście do programowania... 12 1.3.1.
.NET Klasy, obiekty. ciąg dalszy
.NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,
Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)
Zagadnienia (1/3) Rola modelu systemu w procesie analizy wymagań (inżynierii wymagań) Prezentacja różnego rodzaju informacji o systemie w zależności od rodzaju modelu. Budowanie pełnego obrazu systemu
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji
Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Instrukcja do pracowni specjalistycznej z przedmiotu Obiektowe programowanie aplikacji Kod przedmiotu: TS1C410201
Wzorce projektowe. Wstęp
Wstęp Stworzenie programu łatwego w rozwijaniu i naprawie nie należy do łatwych zadań. Na różnych etapach prac można napotkać wiele niemiłych niespodzianek i przeciwności losu, głównie takich które sami
Metody getter https://www.python-course.eu/python3_object_oriented_programming.php 0_class http://interactivepython.org/runestone/static/pythonds/index.html https://www.cs.auckland.ac.nz/compsci105s1c/lectures/
Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;
Wprowadzenie do projektu QualitySpy
Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować
Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.
Języki C i C++ to bardzo uniwersalne platformy programistyczne o ogromnych możliwościach. Wykorzystywane są do tworzenia systemów operacyjnych i oprogramowania użytkowego. Dzięki niskiemu poziomowi abstrakcji
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Enkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);
Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod
Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl
Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki
Wzorce projektowe strukturalne cz. 1
Wzorce projektowe strukturalne cz. 1 Krzysztof Ciebiera 19 pa¹dziernika 2005 1 1 Wst p 1.1 Podstawowe wzorce Podstawowe wzorce Podstawowe informacje Singleton gwarantuje,»e klasa ma jeden egzemplarz. Adapter
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
1) Wzorzec projektowy Adapter. Zastosowanie:
Projektowanie Systemów Komputerowych Laboratoria/Projekty Krzysztof Regulski AGH, WIMiIP WZORCE STRUKTURALNE PSK - projektowanie systemów komputerowych, notatki w Internecie, Beata Frączek, http://brasil.cel.agh.edu.pl/~09sbfraczek
Programowanie i projektowanie obiektowe
Programowanie i projektowanie obiektowe Powiązania i tworzenie obiektów Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk (Wydział Fizyki) PO w. IV Jesień 2014 1 / 27 Powiązania Jeden do jeden Przez
Diagramy klas. dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com
Diagramy klas dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com O czym będzie? Notacja Ujęcie w różnych perspektywach Prezentacja atrybutów Operacje i metody Zależności Klasy aktywne,
Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny
Klasa 2 INFORMATYKA dla szkół ponadgimnazjalnych zakres rozszerzony Założone osiągnięcia ucznia wymagania edukacyjne na poszczególne oceny Algorytmy 2 3 4 5 6 Wie, co to jest algorytm. Wymienia przykłady
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Abstract Factory (fabryka abstrakcyjna)
1/9 Abstract Factory (fabryka abstrakcyjna) Cel: Zapewnienie interfejsu do tworzenia rodzin powiązanych obiektów bez specyfikacji konkretnej klasy. Przykład: Aplikacja do ustawiania mebli: osobne rodziny
Zaawansowane programowanie w języku C++ Programowanie obiektowe
Zaawansowane programowanie w języku C++ Programowanie obiektowe Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej