close

Wzorce projektowe

Skocz do nawigacji Skocz do wyszukiwania

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

Powiązane pozycje

Inne projekty

Linki zewnętrzne