Andrzej Purczyński


Istotną częścią naszego życia jest tworzenie programów.

Paradygmat programowania zorientowanego obiektowo zyskał w ostatnich latach na popularności co wyniknęło z osiągnięcia odpowiedniego poziomu dojrzałości dwu nurtów. Pierwszym był rozwój programowania w latach 70-tych, który doprowadził do przemiany tego procesu w inżynierię oprogramowania. Drugim było powstanie coraz lepszych języków zorientowanych obiektowo i przejście programistów, na przełomie lat 80 i 90, do ich szerokiego wykorzystania. Zorientowano się, że podejście obiektowe prawdopodobnie lepiej odzwierciedla potrzeby użytkownika, co czyni ten sposób programowania bardziej przydatnym.

Podstawową ideą programowania zorientowanego obiektowo jest klasa (class). Została ona przedstawiona po raz pierwszy w koncepcji klasy w Simuli 67. Klasa wyznacza pewien wzorzec dla danej grupy obiektów. Określa ona typ obiektu (object), lub obiektów, co zwykle oznacza możliwość nadawania im pewnych właściwości (properties) i wymuszania zadanych reakcji na zdarzenia (events). W ten sposób obiekt jest zmienną danej klasy i stanowi kapsułę zawierającą kod i dane. Wyznaczają one typ obiektu oraz sposób jego zachowania jako odpowiedź na odebrany komunikat od innego obiektu. Przesłanie komunikatu (message) w programowaniu obiektowym oznacza wywołanie metody danego obiektu i różni się od przesyłania komunikatów znanego np. z działania systemów operacyjnych.

Metody stanowiące opis szeregu działań wykonywanych przez obiekt nie są częścią całego programu, ale przynależą tylko do wybranych obiektów.

W trakcie działania programu obiekty mogą być tworzone dynamicznie za pomocą metod tzw. konstruktorów (odpowiednik instrukcji new w Turbo Pascalu) oraz usuwane za pomocą metod tzw. destruktorów (odpowiednik instrukcji dispose w Turbo Pascalu). Utworzony obiekt jest nazywany instancją danej klasy.

Zwykle języki zorientowane obiektowo wykorzystują trzy techniki projektowania:
  • dziedziczenia (inheritance) - wykorzystuje hierarchiczną organizację klas obiektów i polega na tworzeniu nowych typów na podstawie wcześniej zdefiniowanych. W ten sposób nowy obiekt ma zdolność automatycznego przejmowania właściwości obiektu istniejącego, co znacznie upraszcza modelowanie;
  • hermetyzację (encapsulation) - polega na grupowaniu najistotniejszych informacji i ścisłym ograniczeniu dostępu do nich (spotykany termin kapsułkowanie). Pozwala ukryć te szczegóły danego obiektu, które na danym stopniu projektowania, programowania lub obliczeń nie posiadają istotnego znaczenia, udostępniając na zewnątrz tylko niezbędne działania na obiekcie;
  • wielopostaciowość (polymorphism) - możliwość użycia tej samej nazwy procedury albo operatora z różnymi typami argumentów. Dzięki tej technice jedna metoda może przejawiać różne działanie w zależności od typu obiektu. Np. metoda polegająca na wykonywaniu łączeń w obwodzie elektrycznym o danym natężeniu prądu jest uzależniona od rodzaju obiektu - łącznika (odłącznik, rozłącznik, wyłącznik).

Rozwiązywanie wielu problemów z zakresu CAD/CAM (Computer-Aided Design/Computer-Aided Manufacturing) opiera się na tzw. wzorcach projektowych. Stanowią one jedno z najważniejszych osiągnięć programowania obiektowego. Wzorce projektowe wywodzą się z architektury i antropologii. Christopher Alexander postawił problem obiektywnej oceny rozwiązań architektonicznych i odkrył, że istnieje możliwość określenia podobieństw rozwiązań o wysokiej jakości, które nazwał wzorcami. Antropolog Ruth Benedict jest pionierem analizy kultur wykorzystującej wzorce. Pojęcie wzorca definiuje się jako rozwiązanie problemu w określonym kontekście. Zastosowanie wzorców do projektowania jest coraz szerzej wykorzystywane w innych dziedzinach, m. in. w programowaniu systemów CAD/CAM. Wzorce opisują problemy często pojawiające się w danej dziedzinie i zasadniczą część ich rozwiązania.

W książce A. Shalloway'a i J.R. Trott'a pt. "Projektowanie zorientowane obiektowo. Wzorce projektowe" (Wyd. Helion Gliwice 2001), są przedstawione rozwiązania problemów CAD/CAM z wykorzystaniem wzorców projektowych takich jak: wzorzec fasady, wzorzec adaptera, wzorzec fabryki abstrakcyjnej.

Przykład zastosowania wzorca fasady pokazują rysunki 1 i 2.


Rys. 1. Układ bez zastosowania wzorca fasady

Jeśli obiekt klasy Klient operuje na obiektach klas BazaDanych, Model i Element, to aby pobrać informację o elemencie musi najpierw uzyskać dostęp do bazy danych. Następnie wysyła do modelu komunikat dotyczący jego właściwości i dopiero wtedy pobiera informacje o konkretnym elemencie.


Rys. 2. Układ z zastosowaniem wzorca fasady

Prościej wygląda rozwiązanie oparte na dodatkowym obiekcie w postaci wzorca fasady. Takie rozwiązanie pozwala na zastosowanie prostszego interfejsu systemu danych, gdyż klienci uzyskują potrzebne dane za pomocą mniejszej liczby funkcji.