Programowanie obiektowe
From Obrona
Revision as of 23:43, 24 June 2006
Nr pytania : 1 Autor : Jarosław Mroczek Źródło : http://pl.wikipedia.org/wiki/Programowanie_obiektowe
Programowanie obiektowe
Programowanie obiektowe (ang. object – oriented programming, w skrócie OOP) to metodologia tworzenia programów komputerowych, która pozwala zdefiniować program jako zbiór ,,obiektów” – elementów łączących stan (dane) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się ze sobą w celu wykonywania zadań. Każdy obiekt należy do klasy, która w niektórych językach jest też obiektem, lub przedstawiając sprawę odwrotnie – jest instancją jakiejś klasy. Klasa może mieć nadklasę. Tworzy się więc hierarchia klas. Dane przechowywane przez obiekt to atrybuty, natomiast funkcje z nim powiązane to metody. Niektóre z atrybutów i metod są prywatne – są dostępne tylko z wnętrza obiektu, inne są publiczne - są dostępne zarówno z wnętrza jak i z zewnątrz obiektu. Obiekty powinny podlegać zasadzie enkapsulacji (patrz dalej) – publiczne powinno być tylko to co musi być takie. Programowanie obiektowe wywodzi się z programowania strukturalnego (a to z kolei z programowania proceduralnego), gdzie istniał hierarchiczny podział programu na procedury (moduły) jednak struktury danych oraz procedury operujące na nich nie były ze sobą bezpośrednio związane. Programowanie obiektowe ma na celu ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów. Największym atutem programowania, projektowania, oraz analizy obiektowej jest zgodność takiego podejścia z rzeczywistością – mózg ludzki jest w naturalny sposób najlepiej przystosowany do takiego podejścia przy przetwarzaniu informacji.
Podstawowe założenia paradygmatu obiektowego Istnieje pewna różnica zdań co do tego, jakie cechy metody czy języka programowania czynią je "zorientowanymi obiektowo", jednak powszechnie uważa się, że najważniejsze są następujące cechy:
● 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. ● Enkapsulacja (ukrywanie implementacji, hermetyzacja): Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne 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. ● 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.
DODATKOWO (to już raczej dla tych, którzy chcą się pouczyć) Niektóre języki wprowadzają modyfikacje do założeń obiektowości, na przykład: ● w niektórych językach każda klasa musi mieć nadklasę ● w niektórych językach nadklas może być więcej niż jedna
Obiektowość rozprzestrzeniła się dość znacznie, jednak zwykle w systemach hybrydowych, w połączeniu z programowaniem niskopoziomowym (C++), funkcyjnym (Ruby, Ocaml, niektóre dialekty Lispa), sieciowym (Java), skryptowym (Perl, Python) itd. Systemy czysto obiektowe typu Smalltalk nie znalazły zbyt szerokiego zastosowania. Powyższy opis dopuszcza jak widać bardzo dużą różnorodność – i w rzeczywistości, o ile systemy programowania strukturalnego czy funkcyjnego były do siebie mniej więcej podobne, systemy obiektowe różnią się tak bardzo że nie wiadomo co tak naprawdę znaczy nazwa obiektowe. Krótkie wyszczególnienie różnic: ● Dziedziczenie wielokrotne: ● jest: C++, Python ● nie ma: Java ● dziedziczenie wielokrotne tylko metod: Ruby ● Klasa jest obiektem: ● tak: Ruby, Python ● nie: C++, Ocaml ● Wszystkie obiekty wywodzą się z jednego korzenia i muszą mieć nadklasę: ● tak: Java, Ruby ● nie: C++, Ocaml, Python ● Obiekt można pytać do której podklasy należy: ● tak: Ruby, C++ (z RTTI), Python ● nie: Java, Ocaml ● Mechanizm szablonów do automatycznego generowania klas (np. szablon Drzewo_Binarne<> z klasy X tworzy Drzewo_Binarne<X>): ● tak: Ruby, C++, Ocaml ● nie: Java ● Przeładowywanie (przeciążanie) operatorów: ● tak: Ruby, C++, Python ● nie: Java, Ocaml