– Cześć, Amigo! Dzisiaj pokażę Ci nowy, ciekawy świat. Mam na myśli Programowanie obiektowe (ang. Object-Oriented Programming - OOP). Zdążyłeś się już dowiedzieć, czym są klasy i obiekty. Dzisiaj dowiesz się o nich czegoś więcej, znacznie więcej.
Zaczniemy od czterech filarów OOP. Są to: abstrakcja, enkapsulacja, dziedziczenie i polimorfizm. (Kiedyś były tylko trzy, ale później dodano do nich abstrakcję)
1) Abstrakcja.
Dobrym przykładem abstrakcji w życiu są opisy oferowanych stanowisk pracy w firmie. Nazwa stanowiska to jedno, a obowiązki pracownika na tym stanowisku to drugie.
Wyobraź sobie, że tworzysz schemat organizacji Twojej przyszłej firmy. Możesz na przykład podzielić obowiązki administracyjne pomiędzy osobami pracującymi na różnych stanowiskach. Możesz zrobić to samo z obowiązkami prezesa i rozdzielić je między dyrektora finansowego, dyrektora technologicznego, dyrektora działu marketingu oraz dyrektora działu HR. Możesz także łączyć obowiązki i na przykład scalić stanowisko kierownika biura i rekrutera w jedno.
Załóżmy, że najpierw wymyśliłeś/aś nazwy stanowisk w Twojej firmie, a dopiero później przydzielasz obowiązki do każdego z nich. To właśnie jest abstrakcja – rozdzielanie czegoś dużego i monolitycznego na wiele małych części.
Z perspektywy programistycznej abstrakcja odpowiednio dzieli program na obiekty.
Duży program zazwyczaj można przedstawić jako obiekty oddziaływające na siebie na jeden z wielu różnych sposobów. Abstrakcja pozwala wybrać najważniejsze właściwości pewnego obiektu i pominąć wszystko to, co jest mniej ważne.
Abstrakcja jest jak strategia militarna. Jeśli wybierzesz niewłaściwą, problemów nie naprawi żaden genialny strateg.
2) Enkapsulacja.
Enkapsulacja ma zadanie poprawiać interakcję między obiektami poprzez ich uproszczenie.
Najlepszym sposobem na uproszczenie czegoś jest ukrycie tej skomplikowanej części przed tymi, którzy nie chcą o niej słyszeć. Na przykład, jeśli usiądziesz za sterami w Boeingu, to bardzo dużo czasu zajmie Ci zrozumienie, w jaki sposób kieruje się samolotem:
Z drugiej strony są jeszcze pasażerowie na pokładzie, dla których wszystko wydaje się prostsze: kupują bilet, wsiadają na pokład, startują, lądują i koniec. Możesz bez problemu przemieszczać się między kontynentami, wiedząc jedynie, jak «kupić bilet» i «wsiąść na pokład». Z ich perspektywy nie widać zawiłości całego procesu, związanego z przygotowaniem samolotu, startem, lądowaniem i wieloma potencjalnymi zagrożeniami. Nawet nie wspomnieliśmy o nawigacji satelitarnej, autopilocie i centrum kontroli lotów! A jednak, to wszystko upraszcza nasze życie.
W programowaniu enkapsulacja to «ukrycie implementacji». Lubię tę definicję. Nasza klasa może zawierać setki metod i implementować bardzo złożone działania w przeróżnych sytuacjach. Ale wszystkie te metody możemy ukryć przed wzrokiem ciekawskich (oznaczając je jako «private») i pozostawić jedynie dwie czy trzy metody, aby oddziaływały z innymi klasami (oznaczając je jako «public»). Dzięki temu wszystkie inne klasy w naszym programie będą tylko widziały i wywoływały jedynie te kilka metod w tej klasie. Cała złożoność danej klasy będzie schowana, dokładnie tak, jak kokpit znajdujący się poza wzrokiem radosnych pasażerów.
3) Dziedziczenie.
Dziedziczenie jest pojęciem znanym zarówno w programowaniu, jak i w życiu. W programowaniu dziedziczenie jest specjalną relacją między dwiema klasami. Natomiast w prawdziwym życiu dziedziczenie jest dużo ciekawsze.
Jeśli chcemy w życiu coś stworzyć, mamy dwie możliwości:
1) zabrać się do tego od podstaw, wkładając mnóstwo czasu i wysiłku.
2) zrobić to, używając rzeczy, które już istnieją.
A oto najlepsza strategia: bierzemy dobre, już istniejące rozwiązanie, przerabiamy je i dopracowujemy tak, aby odpowiadało naszym potrzebom, a następnie je implementujemy.
Pomyśl o ewolucji człowieka. Jeśli prześledzimy ten proces od samego powstania życia na naszej planecie, zdamy sobie sprawę, że minęły miliardy lat. Lecz jeśli za początek człowieka uznamy małpę, to czas ten skróci się do kilku milionów lat. Tworzenie czegoś od samego początku zajmuje więcej czasu. Dużo więcej.
W programowaniu jest podobnie, możemy utworzyć jakąś klasę, bazując na innej. Nowa klasa będzie wtedy potomkiem (spadkobiercą) klasy już istniejącej. Jest to bardzo pomocne, zwłaszcza kiedy posiadasz już klasę, która zawiera 80-90% potrzebnych Ci danych i metod. Po prostu należy wtedy zadeklarować odpowiednią klasę jako klasę macierzystą Twojej nowej klasy. Wszystkie dane i metody klasy macierzystej staną się automatycznie częścią tej nowej klasy. Wygodne, prawda?
4) Polimorfizm.
Polimorfizm w programowaniu jest koncepcją, zgodnie z którą różne implementacje zostały ukryte w tym samym interfejsie. Odpowiednią analogią tej sytuacji w prawdziwym życiu jest prowadzenie samochodu.
Jeśli ktoś potrafi prowadzić ciężarówkę, to może także usiąść za kółkiem sportowego auta bądź ambulansu. Taka osoba może prowadzić każdego rodzaju samochód, ponieważ wszystkie one mają taki sam panel kontrolny: kierownica, pedały i skrzynia biegów. Mimo że samochody wewnątrz mogą wyglądać różnie, wciąż działają one na takiej samej zasadzie.
Wracając do programowania – polimorfizm pozwala nam wchodzić w interakcje z obiektami różnych klas (zazwyczaj z takimi ze wspólnym przodkiem) w ten sam sposób. Trudno jest nie zauważyć tych możliwości. Jest to tym ważniejsze, im większy jest nasz program.
OOP stanowi zbiór zasad. Programistycznych reguł. Wszystkie one w jakiś sposób nas ograniczają, ale w zamian (im większy jest program) zapewniają też wiele korzyści. Cztery główne zasady OOP są jak cztery nogi krzesła. Jeśli wyjmiesz jedną z nich, cały system stanie się niestabilny.
GO TO FULL VERSION