Wzorce projektowe
Wzorzec projektowy (przetłumaczalny na włoski jako schemat projektowy , schemat projektowy lub schemat architektoniczny ), w informatyce, a zwłaszcza w dziedzinie inżynierii oprogramowania , jest pojęciem, które można zdefiniować jako „ ogólne rozwiązanie projektowe powtarzającego się problemu ”. Jest to opis lub model logiczny do zastosowania w celu rozwiązania problemu, który może pojawić się w różnych sytuacjach na etapie projektowania i rozwoju oprogramowania , nawet przed zdefiniowaniem algorytmu .rozdzielczy części obliczeniowej. Jest to często skuteczne podejście do ograniczania lub zmniejszania długu technicznego .
Wzorce projektowe zorientowane obiektowo zazwyczaj pokazują relacje i interakcje między klasami lub obiektami , bez określania ostatecznych klas aplikacji, które są zaangażowane, a zatem znajdują się w domenie modułów i wzajemnych połączeń. Na wyższym poziomie są jednak wzorce architektoniczne, które mają znacznie szerszy zakres, opisując ogólny wzorzec przyjęty przez cały system, którego logiczna implementacja ożywia framework .
Historia
Termin ten został po raz pierwszy wprowadzony do architektury w słynnym eseju Christophera Alexandra ; później praca Alexandra zainspirowała narodziny sektora inżynierii oprogramowania poświęconego zastosowaniu koncepcji wzorca projektowego w architekturach oprogramowania , zwłaszcza zorientowanych obiektowo . Dziś termin wzorzec projektowy jest używany głównie w odniesieniu do tego konkretnego kontekstu.
Temat wzorców jest obecnie uważany za jeden z głównych kierunków rozwoju obiektowej inżynierii oprogramowania. Znajduje zastosowania w różnych kontekstach bardzo interesujących dla branży oprogramowania , od tworzenia oprogramowania opartego na komponentach , po systemy otwarte , frameworki i tak dalej. Większość nowoczesnych języków programowania i powiązanych technologii została zaprojektowana (lub zmodyfikowana) w celu zachowania spójności z nowym podejściem do tworzenia oprogramowania.
Narodziny „ruchu” wzorców w informatyce są spowodowane słynną książką Wzorce projektowe: elementy ponownego wykorzystania oprogramowania obiektowego autorstwa Ericha Gammy , Richarda Helma , Ralpha Johnsona i Johna Vlissidesa ( 1995 ). Dzięki sukcesowi tej pracy, jej czterej autorzy stali się tak cytowanymi nazwiskami, że społeczność naukowa zaczęła, dla zwięzłości, utożsamiać ich zbiorczo z pseudonimem: „gang czterech” ( Gang of Four lub GoF ).
Struktura
Wzorzec projektowy składa się z:
- nazwa składająca się z jednego lub dwóch słów, które są jak najbardziej reprezentatywne dla samego wzoru;
- problem , czyli opis sytuacji, do której wzorzec można zastosować. Może zawierać opis konkretnych klas lub problemów projektowych, a także wykaz warunków, w których użycie wzoru jest konieczne;
- rozwiązanie , które opisuje elementy składowe projektu wraz z powiązaniami i powiązanymi implikacjami, nie wchodząc jednak w konkretną implementację. Koncepcja polega na przedstawieniu abstrakcyjnego problemu i względnej konfiguracji elementów odpowiednich do jego rozwiązania;
- konsekwencje , wyniki i ograniczenia wynikające z zastosowania wzorca. Są fundamentalne, ponieważ mogą przechylić szalę w wyborze wzorców: konsekwencje obejmują względy czasu i przestrzeni, mogą opisywać implikacje wzorca w niektórych językach programowania i wpływ na resztę projektu.
Użycie wzorców w opisie innych wzorców powoduje powstanie tzw. języków wzorców .
Klasyfikacja
Wzorce projektowe można sklasyfikować według kilku kryteriów, z których najczęstsze to te, które podkreślają rodzaj problemu, który próbujesz rozwiązać. Rodzaj problemu może być powiązany z konkretną dziedziną projektową ( telekomunikacja , sieci , oprogramowanie ) lub, częściej, z problemem projektowym w szerszym znaczeniu (w inżynierii oprogramowania możemy mówić np. o tworzeniu, zachowaniu, nawigacji obiekty lub struktury danych ).
W swojej książce „band of four” zidentyfikował 23 typy wzorców projektowych, podzielonych na trzy kategorie: strukturalne, twórcze i behawioralne.
Wzorce kreacji
Wzorce twórcze rozwiązują problemy związane z konkretyzacją obiektów
- Fabryka abstrakcyjna (dosłownie „fabryka abstrakcyjna”) zapewnia interfejs do tworzenia rodzin połączonych lub zależnych obiektów, dzięki czemu użytkownicy nie muszą określać nazw konkretnych klas we własnym kodzie.
- Konstruktor („ konstruktor ”) oddziela konstrukcję złożonego obiektu od jego reprezentacji, dzięki czemu sam proces budowy może tworzyć różne reprezentacje.
- Metoda Factory zapewnia interfejs do tworzenia obiektu, ale pozwól podklasom zdecydować, który obiekt utworzyć.
- Inicjalizacja z opóźnieniem jest taktyką tworzenia instancji obiektu tylko wtedy, gdy ma być użyty po raz pierwszy . Jest często używany w połączeniu z metodą fabryki wzorców .
- Wzorzec Prototype („prototyp”) umożliwia tworzenie nowych obiektów poprzez klonowanie obiektu początkowego lub prototypu.
- Singleton ( " singlet") ma na celu zapewnienie, że tylko jedna instancja klasy może zostać utworzona w systemach z pojedynczym wątkiem.
- Blokowanie z podwójnym sprawdzaniem ma na celu zapewnienie, że tylko jedna instancja klasy może zostać utworzona w systemach wielowątkowych.
Wzory strukturalne
Wzorce strukturalne rozwiązują problemy związane ze strukturą klas i obiektów
- Adapter konwertuje interfejs jednej klasy na inny interfejs.
- Bridge ("bridge") pozwala oddzielić abstrakcję klasy od jej implementacji, aby umożliwić jej niezależne zmienianie.
- Composite ("złożony"), używany w celu umożliwienia użytkownikowi manipulowania obiektami w jednolity sposób, organizuje obiekty w strukturę drzewiastą.
- Kontener („ kontener ”) oferuje rozwiązanie na zerwanie enkapsulacji ze względu na zastosowanie dziedziczenia.
- Dekorator ( " dekorator") pozwala na dodawanie metod do istniejących klas w czasie wykonywania (tj. podczas działania programu), pozwalając na większą elastyczność w dodawaniu funkcjonalności do obiektów.
- Rozszerzalność („rozszerzalność”)
- Fasada („ fasada ”) umożliwia, poprzez prostszy interfejs, dostęp do podsystemów, które eksponują złożone i różne interfejsy.
- Flyweight , który pozwala oddzielić zmienną część klasy od części, która może być ponownie wykorzystana.
- Proxy zapewnia reprezentację trudnego lub czasochłonnego obiektu dostępu do uzyskania dostępu lub utworzenia. Proxy pozwala odroczyć dostęp lub tworzenie do momentu, w którym jest to naprawdę potrzebne.
- Rury i filtry
- Dane klasy prywatnej
Wzorce behawioralne
Wzorce behawioralne zapewniają rozwiązania najczęstszych rodzajów interakcji między obiektami.
- Łańcuch odpowiedzialności („łańcuch odpowiedzialności”) zmniejsza sprzężenie między obiektem zgłaszającym żądanie a tym, który je spełnia, dając większej liczbie obiektów możliwość jego zaspokojenia
- Polecenie („ polecenie ”) umożliwia odizolowanie części kodu, która wykonuje akcję, od kodu wymagającego jej wykonania.
- Odbiornik zdarzeń („odbiornik zdarzeń”)
- Odwiedzający hierarchię ("odwiedzający hierarchię")
- Interpreter ("tłumacz"), biorąc pod uwagę język, definiuje reprezentację jego gramatyki wraz z tłumaczem, który używa tej reprezentacji do interpretacji wyrażeń w tym konkretnym języku.
- Iterator ( „ iterator”) rozwiązuje kilka problemów związanych z dostępem i poruszaniem się po elementach struktury danych, bez ujawniania szczegółów implementacji i wewnętrznej struktury kontenera.
- Mediator ( „ mediator”) ingeruje w komunikację między obiektami, aby zaktualizować stan systemu, gdy którykolwiek z nich komunikuje zmianę swojego stanu.
- Memento („przypomnienie”) to operacja wydobycia stanu wewnętrznego obiektu bez naruszania jego hermetyzacji i zapisania go w celu późniejszego przywrócenia.
- Obserwator ( " obserwator") definiuje zależność jeden-do-wielu między różnymi obiektami, tak że jeśli obiekt zmieni swój stan, wszystkie zależne obiekty są powiadamiane o zmianie i mogą się aktualizować.
- Odwiedzający jednorazowo
- Stan („stan”) umożliwia obiektowi zmianę zachowania, gdy zmienia się jego stan wewnętrzny.
- Strategia („ strategia ”) jest przydatna w sytuacjach, gdy zachodzi konieczność dynamicznej modyfikacji algorytmów wykorzystywanych przez aplikację.
- Metoda Template ("metoda schematu") pozwala zdefiniować strukturę algorytmu pozostawiając podklasom zadanie wykonania niektórych kroków zgodnie z ich preferencjami.
- Odwiedzający ( „ gość”) umożliwia oddzielenie algorytmu od struktury obiektów złożonych, do których jest stosowany, w celu dodania nowych zachowań bez konieczności modyfikowania samej struktury.
- Obiekt zerowy ("obiekt zerowy") umożliwia zastąpienie odwołania o wartości null obiektem, który nic nie robi.
Inne rodzaje wzorów
Niektóre wzorce zdefiniowane w literaturze nie działają na poziomie projektowania systemu, dlatego nie można ich właściwie zdefiniować jako wzorców projektowych. Oto kilka przykładów:
Wzory architektoniczne
Wzorce architektoniczne działają na innym (i szerszym) poziomie niż wzorce projektowe i wyrażają podstawowe schematy ustalania organizacji strukturalnej systemu oprogramowania. W tych schematach opisywane są predefiniowane podsystemy, pełnione przez nie role oraz relacje między nimi.
- Tablica , architektura do zastosowań sztucznej inteligencji
- Pośrednik
- Klient-serwer , reprezentuje typ aplikacji sieciowej, w której komputer kliencki tworzy instancję interfejsu użytkownika aplikacji, łącząc się z aplikacją serwera lub systemem bazy danych.
- Warstwy , architektura warstwowa
- Mikrojądro
- Model-View-Controller (często w skrócie MVC ) , który polega na oddzieleniu komponentów oprogramowania realizujących model funkcjonalności biznesowej ( model ), od komponentów implementujących logikę prezentacji ( view ) oraz od kontrolnych, z których te funkcjonalności korzystają ( kontrolera ).
- Model-View-ViewModel (często skracany do MVVM )
- Nagie przedmioty
- Rury i filtry
- Kontrola abstrakcji prezentacji
- Odbicie , zapewnia mechanizm dynamicznej zmiany struktury i zachowania systemów oprogramowania. Wspiera modyfikację podstawowych aspektów, takich jak typ struktur i mechanizmy wywoływania funkcji.
- Repozytorium , wzorzec architektoniczny powiązany z aspektami trwałości
- Front Controller , wzorzec architektoniczny, który wymaga użycia jednego pliku do zarządzania wszystkimi żądaniami
- Data Access Object , do zarządzania trwałością : jest to w zasadzie klasa z powiązanymi metodami , która reprezentuje jednostkę tabelaryczną RDBMS .
- Data Transfer Object , do przesyłania danych między podsystemami aplikacji. DTO są często używane w połączeniu z obiektami dostępu do danych (DAO) w celu pobrania wyżej wymienionych z bazy danych .
Wzorzec metodologii
- Odpowiedzialność , czyli „wyraźne określenie i podział odpowiedzialności ” przypisanej do każdego obiektu lub komponentu systemu, jest podstawowym wzorcem metodologicznym wskazanym w książce Design Patterns .
- Spraw, aby działało, spraw, aby było dobrze, spraw, aby było szybkie, spraw, aby było małe
Wzorzec współbieżności
W przypadku procesów, które jednocześnie wykonują czynności na udostępnionych danych, mówimy o współbieżności . Niektóre wzorce projektowe zostały opracowane, aby zachować synchronizację stanu danych w takich sytuacjach:
- Obiekt aktywny
- Baling wzór
- Podwójnie sprawdzony wzór blokowania
- Zawieszenie strzeżone
- Wzorzec liderów/naśladowców
- Obiekt Monitora , który dopuszcza tylko aktywny proces w jego obrębie, jednocześnie nie wymaga jawnego kodowania wzajemnego wykluczania.
- Wzór blokady odczytu i zapisu
- Wzór harmonogramu
- Wzór puli wątków
- Przechowywanie specyficzne dla wątków
- Synchronizacja przekazywania tokena
- Wzór reaktora
Bibliografia
- Gamma, E. , Helm, R. , Johnson, R. i Vlissides, J. , Wzorce projektowe : elementy ponownego wykorzystania oprogramowania obiektowego , Addison Wesley, 1995, ISBN 88-7192-150-X
- Oryginał: Wzorce projektowe: Elementy oprogramowania obiektowego wielokrotnego użytku , Addison Wesley, 1995, ISBN 0-201-63361-2
- Eckel, B. , Myślenie wzorcami za pomocą Javy , MindView (wersja robocza)
Powiązane pozycje
Inne projekty
Wikimedia Commons zawiera obrazy lub inne pliki dotyczące wzorców projektowych
Linki zewnętrzne
- Repozytorium wzorców Portland , w c2.com .
- Biblioteka Wzgórz Wzgórz
- Filozofia wzorca , na inf.unitn.it . Pobrano 7 kwietnia 2005 (zarchiwizowane z oryginału 16 marca 2005) .
- Strona z wzorami autorstwa Vince'a Hustona , na stronie vincehuston.org .
- Wzorce projektowe GoF w języku Java (w języku włoskim) nastronie eii.pucv.cl.