Wzorce rozwiązań

Wzorce projektowane są cegiełkami do budowy złożonych systemów gospodarczych, społecznych i informatycznych.

Wzorce projektowane są cegiełkami do budowy złożonych systemów gospodarczych, społecznych i informatycznych.

Każdego dnia napotykamy na problemy, z którymi mieliśmy wcześniej do czynienia i znamy ich rozwiązanie. Jeżeli chcemy wykonać pewną pracę, ale brakuje nam narzędzia, którym zwykle się posługujemy, to poszukujemy zastępczego. Gdy chcemy wbić gwóźdź w ścianę, a nie mamy młotka, sięgamy np. po obcęgi.

Śledząc międzynarodowe spory, widzimy działanie zawodowych mediatorów powołanych do ich rozwiązywania. Kryzysom politycznym przyglądają się cieszący się dużym prestiżem obserwatorzy. Zbyt obciążony pracą kierownik zespołu może scedować odpowiedzialność na podwładnego. Ponosząca straty finansowe firma decyduje się na obniżenie kosztów poprzez redukcję liczby pracowników. Projektant, definiując obiekt, który w zależności od stanu, w jakim się znajduje, w inny sposób zachowuje się, decyduje się na wyróżnienie nowego obiektu: obiekt-stan. Mistrzowie szachownicy wiedzą, jakich sytuacji należy wystrzegać się, by nie popaść w kłopoty.

We wszystkich wymienionych sytuacjach mamy do czynienia z problemem i jego rozwiązaniem w określonym kontekście, czyli wzorcem rozwiązań.

Wzorce w informatyce

Projektanci systemów informatycznych używają wzorców projektowych (design patterns). Fachowcy od reinżynierii organizacji używają wzorców organizacyjnych (organizational patterns) oraz wzorców procesów (process patterns). Wydaje się, że można też pokusić się o wzorce analityczne (analysis patterns).

Zajmijmy się najpierw dobrze zdefiniowanymi wzorcami projektowymi. Służą one do zamrożenia pewnych decyzji, jakie podejmuje projektant rozwiązując klasę podobnych problemów. Projektant - raz określając sposób rozwiązania - może przy ponownym zetknięciu się z podobnym problemem zastosować znane sobie rozwiązanie.

E. Gamma i inni (tzw. Gang Czterech) postanowili skatalogować znane im wzorce projektowe i udostępnić je. Ich fundamentalną pracą jest książka "Design Patterns" wydana w 1995 r. Wzorce projektowe wprowadzają do świata projektantów systemów bardzo precyzyjny język, pozwalający na szybkie przekazanie sposobu rozwiązania złożonych problemów.

Liczbą użytych wzorców projektowych można mierzyć jakość oprogramowania tworzonego techniką obiektową. U podstaw wzorców projektowych znajdują się tak znane koncepcje, jak zależność (coupling) i spójność (cohesion), pochodzące od L. Constantine'a, oraz polimorfizm i uogólnienie - uszczegółowienie wraz z mechanizmem dziedziczenia. Okazuje się, że o możliwości wielokrotnego użycia pewnego rozwiązania (np. biblioteki klas) decyduje jakość tego rozwiązania wyrażana w kategoriach zależności i spójności jego elementów. Im mniejsza zależność między elementami, tym mniejszy zasięg mają zgłaszane żądania zmian wymagań w stosunku do danego rozwiązania i tym łatwiej to rozwiązanie powielać.

Łatwo zauważyć wpływ, jaki może mieć jakość rozwiązania na organizację projektu informatycznego. Jeżeli wyobrazimy sobie, że każdy z podsystemów projektuje niezależny zespół, to liczba wymaganych uzgodnień między zespołami maleje wraz ze wzrostem niezależności podsystemów.

Wzorce projektowe

Należy dokładniej przyjrzeć się omawianym koncepcjom. Wzorce projektowe są cegiełkami, za pomocą których można budować złożone systemy, stanowią mikroarchitekturę systemu. Nie można jednak ich bezpośrednio użyć, tak jak biblioteki klas, gdyż wymagają adaptacji. Wzorzec projektowy może być zastosowany w wielu dziedzinach. Dąży się do tego, żeby zasięg i wielkość wzorców były względnie małe, dzięki czemu stają się bardziej uniwersalne.

E. Gamma wyróżnił wzorce:

* tworzące - dotyczą procesu tworzenia obiektu

* strukturalne - wskazują kompozycje obiektów

* dynamiczne - wskazują na sposób, w jaki obiekty oddziałują na siebie i delegują odpowiedzialności.

Wzorce tworzące abstrahują od tego, w jaki sposób tworzone są obiekty, poprzez ukrycie opisu procesu tworzenia obiektów w podklasie. Wzorce strukturalne wykorzystują mechanizm dziedziczenia do rozszerzenia funkcjonalności klas. Wzorce dynamiczne opisują, w jaki sposób grupa obiektów współpracuje między sobą, by wykonać zadanie, którego żaden z obiektów nie mógłby wykonać samodzielnie.

Weźmy dla przykładu wzorzec projektowy o nazwie mediator. System można sobie wyobrazić jako zbiór komunikujących się ze sobą obiektów. Wraz ze wzrostem liczby obiektów, tak jak w zespołach ludzkich, lawinowo rośnie liczba komunikatów przesyłanych między nimi. Może to doprowadzić do paraliżu komunikacyjnego lub organizacyjnego. Zmiana zachowania systemu złożonego z wielu komunikujących się ze sobą obiektów może być utrudniona. Rozwiązaniem jest upakowanie zachowania zbioru obiektów do jednego obiektu zwanego mediatorem, który jest odpowiedzialny za sterowanie i koordynowanie oddziaływań grupy obiektów. Obiekty biorące udział w scenariuszu (use case) mogą kontaktować się jedynie za pośrednictwem mediatora.

Innym przykładem jest wzorzec "łańcuch odpowiedzialności", polegający na delegowaniu odpowiedzialności przez obiekt odbierający komunikat na inne obiekty, które potrafią ten komunikat obsłużyć. Ten sam mechanizm działa w organizacjach.

Każdy wzorzec projektowy jest opisywany za pomocą diagramu klas-asocjacji w notacji OMT lub Booch, pokazującego statyczne związki między obiektami wchodzącymi w skład wzorca oraz diagramu śledzenia zdarzeń, pokazującego sekwencję zdarzeń wymienianych między obiektami (dynamiczne związki między obiektami). Dodatkowo podawana jest przykładowa implementacja w języku C++. Opis wzorca projektowego musi zawierać uzasadnienie jego wykorzystania oraz konsekwencje jego użycia dla architektury systemu.

Zastosowania wzorców

Przyjrzyjmy się jednemu z zastosowań wzorców projektowych. Wzorzec "Broker" może być użyty do modularyzacji systemu rozproszonego poprzez osłabienie zależności (coupling) między komponentami ze sobą współpracującymi. "Broker" jest odpowiedzialny za koordynowanie komunikacji między obiektami oraz za nawiązywanie współpracy z innymi brokerami za pomocą "Mostu", który jest również wzorcem projektowym.

Na wzorcu "Broker" oparto architekturę CORBA (Common Object Request Broker Architecture), będącą standardem zdefiniowanym przez OMG. CORBA jest technologią obiektową, służącą do konstrukcji systemów rozproszonych w środowiskach heterogenicznych. Obiekty CORBA komunikują się ze sobą poprzez interfejsy zdefiniowane za pomocą języka IDL (Interface Definition Language). Najbardziej znaną i rozpowszechnioną implementacją standardu CORBA jest Orbix firmy IONA Technologies.

Innym zastosowaniem wzorca "Broker" jest technologia OLE 2 firmy Microsoft. W przeciwieństwie do standardu CORBA, obiekty OLE komunikują się ze sobą przez binarny protokół, który musi być wspomagany językiem programowania używanym do implementacji systemu.

Największym systemem (i najbardziej popularnym), w którym użyto wzorca "Broker", jest WWW. Przeglądarki HotJava, Mosaic, Netscape i działają jako brokery.

Prawdziwe efekty przynosi stosowanie wzorców, które wzajemnie uzupełniają się. Możemy wtedy mówić o języku wzorców rozwiązań.

Wzorce w firmie

W jaki sposób można zastosować wzorce rozwiązań do usprawnienia organizacji? Przyjrzyjmy się wzorcom organizacyjnym.

Projekt informatyczny opóźnia się. Ludzie są przeciążeni pracą. Drugorzędne zadania pochłaniają ich czas i siły. Zbyt dużo kosztuje przestawienie się na wykonywanie głównych zadań. Wzorzec "Zespół na zadanie" proponuje podział zespołu, tak aby każdy miał główne zadanie i takie drugorzędne zadania, które nie odrywają od wykonywania głównego (nie do pogodzenia jest projektowanie oprogramowania i branie udziału w spotkaniach lub odpowiadanie na telefony).

Szczególnym przypadkiem tego wzorca jest inny o nazwie "Złóż ofiarę z jednej osoby", mający zastosowanie, gdy cały zespół musi przerywać wykonywanie głównego zadania. Ten problem można rozwiązać przydzielając jedną (w idealnej sytuacji) lub więcej osób do obsługi "przerwania".

Innym przykładem wzorców rozwiązań mogą być wzorce kształcenia. Tradycyjnym sposobem prowadzenia kursu jest wykład, a następnie ćwiczenia, na których próbuje się rozwiązać problem, bazując na wiedzy zdobytej podczas biernego wysłuchania wykładu. Można sobie wyobrazić bardziej aktywny sposób prowadzenia kursu, na którego przebieg mają wpływ uczestnicy na bieżąco go modyfikując, przy założonej minimalizacji czasu trwania wykładu w stosunku do czasu trwania ćwiczeń.

Idea wzorców pochodzi od architekta C. Alexandera , który po raz pierwszy je przedstawił w 1977 r. Później odkryto analogię między projektowaniem budynków a tworzeniem oprogramowania. Wzorce projektowe wchodzą w skład standardu podejścia obiektowego UML (Unified Modeling Language).

Tym, którym mimo wszystko wzorce rozwiązań wydają się być nowomową, podpowiadam, że jest to raczej sposób myślenia, mający zastosowanie w wielu (we wszystkich?) dziedzinach działalności ludzkiej. Namawiam do odkrywania wzorców rozwiązań.

Jacek Wojcieszyński jest pracownikiem firmy IB Polsoft, zajmującej się informatyką bankową.


TOP 200