Pojęcia związane z programowaniem obiektowym
Programowanie obiektowe (ang. object-oriented programming) — paradygmat programowania, w którym programy definiuje się za pomocą obiektów — elementów łączących stan (czyli dane, nazywane najczęściej polami) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań.
Podstawowe cechy języków programowania czyniące je obiektowymi :
Abstrakcja - Każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy. Procesy, funkcje lub metody mogą być również abstrahowane, a kiedy tak się dzieje, konieczne są rozmaite techniki rozszerzania abstrakcji.
Hermetyzacja - Czyli ukrywanie implementacji, enkapsulacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko własne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy. Pewne języki osłabiają to założenie, dopuszczając pewien poziom bezpośredniego (kontrolowanego) dostępu do "wnętrzności" obiektu. Ograniczają w ten sposób poziom abstrakcji. Przykładowo w niektórych kompilatorach języka C++ istnieje możliwość tymczasowego wyłączenia mechanizmu enkapsulacji; otwiera to dostęp do wszystkich pól i metod prywatnych, ułatwiając programistom pracę nad pośrednimi etapami tworzenia kodu i znajdowaniem błędów.
Polimorfizm - Referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu – na przykład szablony i przeciążanie operatorów w C++.
Dziedziczenie - Porządkuje i wspomaga polimorfizm i enkapsulację dzięki umożliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy. W typowym przypadku powstają grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów.
Podstawowe pojęcia :
Klasa jest częściową lub całkowitą definicją dla obiektów. Definicja obejmuje dopuszczalny stan obiektów oraz ich zachowania. Obiekt, który został stworzony na podstawie danej klasy nazywany jest jej instancją. Klasy mogą być typami języka programowania - przykładowo, instancja klasy Owoc będzie mieć typ Owoc. Klasy posiadają zarówno interfejs, jak i strukturę. Interfejs opisuje, jak komunikować się z jej instancjami za pośrednictwem metod, zaś struktura definiuje sposób mapowania stanu obiektu na elementarne atrybuty
Obiekt to podstawowe pojęcie wchodzące w skład paradygmatu programowania obiektowego w analizie i projektowaniu oprogramowania oraz w programowaniu.
Jest to struktura zawierająca:
- dane
- metody, czyli funkcje służące do wykonywania na tych danych określonych zadań.
Z reguły obiekty (a właściwie klasy, do których te obiekty należą) są konstruowane tak, aby dane przez nie przenoszone były dostępne wyłącznie przez odpowiednie metody, co zabezpiecza je przed niechcianymi modyfikacjami. Takie zamknięcie danych nazywa się enkapsulacją czyli jakby zamknięcie ich w kapsule.
Zmienna to byt fizyczny o którym mówimy że ma wartość
Przez pojęcie zmiennej w Javie rozumiemy referencję, wskazanie, do określonego miejsca w pamięci komputera. Zmienne reprezentują dane i pozwalają za swoim pośrednictwem nimi manipulować.
Stała to rodzaj zmiennej, której wartość nie podlega modyfikacji
Stała to zmienna, która po nadaniu jej wartości nie może być już zmieniona. Zazwyczaj tej konstrukcji używa się do definiowania np. ustawień. Chcąc uzyskać taki efekt należy użyć słowa kluczowego final
Metoda w programowaniu obiektowym funkcja składowa klasy, której zadaniem jest działanie na rzecz określonych elementów danej klasy lub klas z nią spokrewnionych (zob. też dziedziczenie).
Metody wiąże się z klasami głównie po to, aby uniknąć użycia funkcji globalnych, które i tak nie zostaną użyte w celu innym niż na rzecz konkretnej klasy. Metody mają też szerokie zastosowanie w programowaniu obiektowo orientowanym, w postaci tzw. metod wirtualnych.
Konstruktor w programowaniu obiektowym to specjalna metoda danej klasy, wywoływana podczas tworzenia jej instancji. Zadaniem konstruktora jest zainicjowanie obiektu, a w niektórych językach programowania także utworzenie obiektu. Wywołanie konstruktora powoduje wykonanie następujących zadań:
- obliczenie rozmiaru obiektu
- alokacja obiektu w pamięci
- wyczyszczenie (zerowanie) obszaru pamięci zarezerwowanej dla obiektu (tylko w niektórych językach)
- wpisanie do obiektu informacji łączącej go z odpowiadającą mu klasą (połączenie z metodami klasy)
- wykonanie kodu klasy bazowej (w niektórych językach niewymagane)
- wykonanie kodu wywołanego konstruktora
Destruktor wywoływany jest automatycznie w momencie niszczenia obiektu (usuwania obiektu z pamięci). Przeznaczeniem destruktora jest wykonanie czynności końcowych dla obiektu, np. zwalnianie zasobów, zamykanie plików, zamykanie połączeń z bazami danych
Pole to pojedyncza zmienna, stanowiąca fragment struktury, unii, klasy, obiektu lub rekordu tabeli bazodanowej. Z polem związany jest pewien typ oraz zestaw innych atrybutów, w tym atrybutów rozmieszczenia. Do pola konkretnej, zdefiniowanej struktury danych można odwołać się za pomocą selekcji itp.
Interfejs jest definicją abstrakcyjnego typu posiadającego jedynie operacje, a nie dane. Kiedy w konkretnej klasie zdefiniowane są wszystkie metody interfejsu mówimy, że klasa implementuje dany interfejs. W programie mogą być tworzone zmienne typu referencja do interfejsu, nie można natomiast tworzyć obiektów tego typu. Referencja może wskazywać na obiekt dowolnej klasy implementującej dany interfejs. Interfejs określa udostępniane operacje, nie zawiera natomiast ich implementacji i danych. Z tego powodu klasy mogą implementować wiele interfejsów, bez problemów wynikających z wielokrotnego dziedziczenia. Wszystkie metody w interfejsie z reguły muszą być publiczne.
Agregacja (inaczej zawieranie się, gromadzenie) w programowaniu obiektowym to sytuacja, w której tworzy się nową klasę, używając klas już istniejących (często nazywa się to "tworzeniem obiektu składowego"). Nowa klasa może być zbudowana z dowolnej liczby obiektów (obiekty te mogą być dowolnych typów) i w dowolnej kombinacji, by uzyskać żądany efekt. Agregacja jest często określana jako relacja typu "zawiera" np. "samochód zawiera silnik" - gdzie "samochód" i "silnik" są klasami, oraz klasa "samochód" zawiera w sobie obiekt (czasami referencję czy wskaźnik) typu "silnik".
Cecha (ang. trait) jest mechanizmem współdzielenia zachowania klas podobnym do domieszek, który pozwala ominąć część ograniczeń pojedynczego dziedziczenia. Cechy są jedynie zbiorem dodatkowego kodu (metody oraz atrybuty), który może zostać wstrzyknięty do wybranych klas na etapie kompilacji. W przeciwieństwie do domieszek, podczas wykonywania program nie ma pojęcia o istnieniu cech, dlatego nie można w locie sprawdzić czy obiekt przekazany do funkcji obsługuje określoną ceche]. Nie można także tworzyć obiektów cech.
Dziedziczeniem (ang. inheritance) w programowaniu obiektowym nazywamy mechanizm współdzielenia funkcjonalności między klasami. Klasa może dziedziczyć po innej klasie, co oznacza, że oprócz swoich własnych atrybutów oraz zachowań, uzyskuje także te pochodzące z klasy dziedziczonej. Klasa dziedzicząca jest często nazywana klasą pochodną lub potomną (w j. angielskim: subclass lub derived class), zaś klasa, z której następuje dziedziczenie — klasą bazową (w ang. superclass). Z jednej klasy bazowej można uzyskać dowolną liczbę klas pochodnych. Klasy pochodne posiadają obok swoich własnych metod i pól, również kompletny interfejs klasy bazowej.
Domieszka (ang. mixin) jest rodzajem klasy, która dostarcza określoną funkcjonalność innym klasom bez możliwości tworzenia jej obiektów. W przeciwieństwie do zwykłego dziedziczenia, domieszkowanie klasy nie jest formą specjalizacji, lecz zwykłym dostarczeniem odpowiedniej funkcjonalności. Klasa może pozyskać część lub całość funkcjonalności z jednej lub większej liczby domieszek.