2. Wprowadzenie do obiektowości
Języki obiektowe posługują się pojęciem obiektu i klasy. Cóż to jest "obiekt" ? Intuicyjnie czujemy, że to coś w rodzaju "przedmiotu",
czegoś co można wyodrębnić, nazwać, określić jego właściwości. Każdy z tych obiektów ma inne właściwości. Np. człowiek ma imię, jest
w określonym wieku. Samochód ma kolor i może też np. być charakteryzowany
mocą silnika czy liczbą drzwi. Zauważmy dalej, że obiekty mogą wykonywać jakieś czynności. Powiemy: udostępniają jakieś usługi. Inne obiekty mogą "poprosić" je o wykonanie tych usług. Powiemy, że do obiektów posyłane są komunikaty, żądające od nich wykonania określonych usług. Obiekty nie mogą wykonywać dowolnych czynności (świadczyć dowolnych usług).
Samochód może ruszyć lub stanąć, ale nie zacznie śpiewać. Zatem klasa będzie opisywac nie tylko takie wspólne cechy grupy podobnych obiektów jak kolor, czy wiek, czy waga, ale również zestawy usług, które obiekty tej klasy mogą świadczyć. A więc i komunikaty, które do tych obiektów można posłać. Rozumowanie powyższe stanowią abstrakcyjne odzwierciedlenie cech rzeczywistości. Gdybyśmy mieli w języku programowania podobne pojęcia, to moglibyśmy ujmować
projekt rozwiązania rzeczywistego problemu i jego oprogramowanie w języku
adekwatnym do problemu. Możemy mieć np. klasę urządzeń elektrycznych o następujących atrybutach:
szerokość, wysokość, stan (włączone-wyłączone) oraz udostępniających usługi:
włączania i wyłączania. class ElDev { width, height; <-- atrybuty: szerokość, wysokość, stan isOn; ================= Interfejs komunikatów method on() isOn = true; <--- usługa on (włącz), inaczej: metoda o nazwie on method off() isOn = false; <--- usługa off (wyłacz),inaczej: metoda o nazwie on } Gdy mamy dwa obiekty - egzemplarze klasy urządzeń elektrycznych, oznaczane a i b, to możemy symulować w programie sekwencję działań: włączenie urządzenia a, właczenie urządzenia b, wyłączenie urządzenia a, za pomocą komunikatów posyłanych do obiektów (inaczej wywołania metod na rzecz obiektów), np. w Javie (czy C++): a.on(); // komunikat: obiekcie a włącz się b.on(); // obiekcie b włącz się a.off(); // obiekcie a wyłącz się Oprócz odzwierciedlenia w programie "języka problemu" abstrakcja obiektowa ma jeszcze jedną ważną przewagę nad ujęciami nieobiektowymi. Mianowicie, zwykle atrybuty obiektu nie są bezpośrednio dostępne. W programie z obiektami "rozmawiamy" za pomocą komunikatów, obiekty same "wiedzą najlepiej" jak zmieniać swoje stany. Dzięki temu nie możemy nic nieopatrznie popsuć, co więcej nie możemy zażądać od obiektu usługi, której on nie udostępnia. Dane (atrybuty) są (powinny być) ukryte i są traktowane jako nierozdzielna całość z
usługami - metodami.
Nazywa się to hermetyzacją (enkapsulacją) i oznacza znaczne zwiększenie odporności programu na błędy. Podejście obiektowe umożliwia ponowne wykorzystanie już gotowych klas przy
tworzeniu klas nowych, co znacznie oszczędza pracę przy kodowaniu, a także
chroni przed błędami. Np. komputer jest niewątpliwie urządzeniem elektrycznym. Jest obiektem klasy
ElDev. Ale komputery (oprócz okreslonych w klasie ElDev atrybutów: wysokość,
szerokość, stan: włączony-wyłączony) mają jakieś swoje specyficzne,
wyspecjalizowane cechy. Oczywiście program będzie obiektem klasy Program, a w komunikacie do
obiektu-komputera powinniśmy podać jako argument obiekt-program do
wykonania. class Komputer extends ElDev { method run(Program p) if (isOn()) wykonanie_programu_p; } a następnie użyć nowej klasy Komputer w programie: Komputer a, b, c; Program x, y, z; ... a.on(); a.run(x); ... a.off(); Tyle wprowadzenia, o charakterze bardzo wstępnym i raczej intuicyjnym.
|