Wzorzec to powtarzalny wzór, który może być odkryty i powtarzany dla uzyskania pozytywnych wpływów na nasz projekt. Tymi pozytywami mogą być np. rozszerzalność i czytelność kodu. Nie sposób jednak nadmienić, że częste stosowanie wzorców do wszystkiego powoduje jednakże przede wszystkim wyeksponowanie ich minusów, czyli np. zbędnego rozbudowania kodu.

Wzorce projektowe oprogramowania zostały po raz pierwszy nazwane i formalnie opisane w 1994 roku przez autorów książek tzw. Gangu Czterech (nie mylić z punkową kapelą 😉 ): Ericha Gammę, Johna Vlissidesa, Ralpha JohnsonaRicharda Helma m.in w “Design Patterns — Elements of Reusable Object-Oriented Software”. W pracy autorzy inspirowali się wcześniejszymi publikacjami teoretyka Christopher’a Alexandr’a np. “Język Wzorców” (ang: “A Pattern Language”) z 1977r.

Wzorce projektowe służą zatem do utrzymania “czystości programowania” – przejrzystości kodu, pomagają uniknąć niespójności, czy nieoprogramowania ważkich choć przegapionych funkcjonalności np. dotyczących obsługi specyficznych błędów. Na wzorzec składają się:

  • nazwa wzorca,
  • opis rozwiązywanego przez niego problemu,
  • rozwiązanie problemu,
  • lista konsekwencji jego użycia.

Typy wzorców

W zależności od rodzaju tworzonych wzorców przyjęło się dzielić je na 3 grupy, w których zostały wyspecyfikowane przykładowe wzorce. Do najczęściej proponowanych należą 23 wzorce przedstawione na poniższej rycinie.

Wzorce kreacyjne

Tradycyjna metoda tworzenia obiektów może prowadzić do tworzenia obiektów w niekontrolowany sposób. Może skutkować rozrzuceniem obiektów po całej aplikacji, co może zwiększyć ogólną złożoność projektu aplikacji. Może implikować niestabilność aplikacji i może prowadzić do problemów projektowych. Kreacyjne wzorce projektowe zmniejszają tę niestabilność i złożoność projektu, zapewniając różne sposoby implementacji kontrolowanego tworzenia obiektów w aplikacji zorientowanej obiektowo. Istnieje 5 różnych wzorców projektowania kreacyjnego, a mianowicie:

Wzorce strukturalne

Wzorce projektowania strukturalnego zapewniają różne sposoby organizowania klas i obiektów w aplikacji zorientowanej obiektowo, co prowadzi do uproszczenia projektowania dużych i złożonych struktur. Opisują proces, za pomocą którego możemy łączyć klasy i obiekty w celu utworzenia zorganizowanej, elastycznej i połączonej struktury. Proponowanych jest 7 różnych typów wzorców projektowania struktury, a mianowicie:

Wzorce behawioralne

Wzorce projektowania behawioralnego zajmują się interakcją obiektów między sobą. Wzorce te wynikają z faktu, że obiekty w aplikacji obiektowej powinny być ze sobą połączone w taki sposób, aby można było uniknąć tzw. twardego kodowania (opracowania kodu spełniającego tylko i wyłącznie obsługę konkretnego przypadku w sposób niejako “po chłopsku” i w zasadzie nie do użycia jako kod uniwersalny dla innych przypadków) i dobrze obsługiwać dane wejściowe użytkownika. Te wzorce projektowe wykorzystują techniki luźnego łączenia, aby zapewnić elastyczny i skuteczny przepływ informacji. Wzorce projektowania zachowań obejmują 12 różnych wzorców, a mianowicie:

  • Chain of Responsibility
  • Command
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Template
  • Visitor
  • Null Object

Dobre praktyki

Reasumując – Wzorce Projektowe to zestaw wypróbowanych i dobrze już przetestowanych gotowych zestawów rozwiązań stworzonych przez zaawansowanych praktyków z długoletnim nieraz już doświadczeniem. W zasadzie każdy, kto chce parać się programowaniem powinien mieć wiedzę na temat tych technik dających nam następujące benefity:

  • Wzorce projektowe ułatwiają nam życie, dostarczając gotowe szablony projektowe, które czynią systemy obiektowe bardziej elastycznymi, bardziej odpornymi na zmiany i łatwiejszymi w utrzymaniu.
  • Możemy udoskonalić nasze umiejętności programowania obiektowego, po prostu ucząc się wzorców projektowych, ponieważ wzorce projektowe dostarczają wskazówek, które uczą nas rozwiązywania wszelkiego rodzaju typowych problemów związanych z projektowaniem obiektowym.
  • Programiści mogą używać nazwy wzorca projektowego, aby dokładnie wyjaśnić czym zajmować się ma dana aplikacja.
  • Wzorce projektowe definiują wspólny język, którego programista może używać do komunikacji i współpracy z innymi programistami.

Dlaczego Wzorce Projektowe są lepsze od tego co mogę napisać?!

Uzasadnienie tego nagłówka jest przedstawione w 3 podstawowych zasadach poniżej.

Akceptacja: Najpierw spróbuj zaakceptować fakt, że wzorce projektowe rozwiązują powszechnie występujące problemy w projektowaniu oprogramowania zorientowanego obiektowo. Dlatego tworząc oprogramowanie obiektowe nie powinniśmy komplikować procesu poprzez wymyślanie koła na nowo.

Uznanie: Przed Tobą uznanie znaczenia stosowania najlepszych praktyk podczas tworzenia aplikacji zorientowanych obiektowo. Nie sposób jednak docenić wartości dawanej przez wzorce, gdy sam dużo nie programujesz i nie napotykasz na swej drodze powracających w różnych projektach problemów z podobnym w funkcjonalności kodem.

Internalizacja: Po zidentyfikowaniu odpowiedniego wzorca projektowego dla naszej aplikacji, możemy spróbować go zaimplementować i dodać wewnętrznie do naszej aplikacji w taki sposób, aby zapewniał możliwość ponownego użycia, łatwość zarządzania i rozszerzalność

Jaką korzyść niosą ze sobą Wzorce Projektowe

Korzyści ze stosowania wzorców projektowych w tworzeniu oprogramowania zorientowanego obiektowo to:

  • Ponieważ wzorce projektowe są uważane za najlepsze praktyki w projektowaniu oprogramowania zorientowanego obiektowo, mogą przyspieszyć proces tworzenia oprogramowania, zapewniając wydajne paradygmaty.
  • Wzorce projektowe pomagają programistom komunikować się i współpracować z innymi programistami na poziomie abstrakcyjnym, ponieważ są uważane za standard branżowy w projektowaniu oprogramowania obiektowego i są dobrze znane wśród społeczności programistów. Zamiast opisywać całą strukturę aplikacji, możemy bezpośrednio użyć nazwy wzorca projektowego, aby wyjaśnić innym programistom ideologię projektowania oprogramowania i jej implementację.
  • Wzorce projektowe nadają się do wielokrotnego użytku w wielu projektach i mogą zapobiegać pobocznym problemom, które mogą później siać spustoszenie w aplikacji. Dzieje się tak, ponieważ wzorce projektowe zapewniają logiczne i efektywne rozwiązanie konkretnego i często występującego problemu związanego z projektowaniem oprogramowania, bez uwzględnienia faktycznej implementacji.
  • Stosowanie wzorców projektowych zapewnia przejrzystość projektowania architektury aplikacji oraz zwiększa zrozumienie i czytelność kodu źródłowego. Całą architekturę aplikacji obiektowej można logicznie opisać nazwą wzorca projektowego użytego w tej aplikacji. Zapewnia to przejrzystość, która umożliwia programistom współpracę i zrozumienie projektu oprogramowania oraz implementacji aplikacji obiektowej.

Konkludując:

  • Wzorzec projektowy to szablon, który zapewnia rozwiązanie powtarzającego się problemu w projektowaniu oprogramowania.
  • Wzorzec projektowy pomaga nam budować wydajne oprogramowanie obiektowe.
  • Wzorzec projektowy może być wzorcem twórczym, strukturalnym lub behawioralnym.
  • Aby poznać i wykorzystać wzorce projektowe w aplikacji, należy zaakceptować ich znaczenie, rozpoznać ich zastosowanie w oprogramowaniu, a następnie je wdrożyć.
  • Wzorce projektowe zapewniają lepszą architekturę aplikacji oraz łatwy w zarządzaniu, przejrzysty i zrozumiały kod źródłowy.