1. Pojęcie klasy Pojęcia i obiekty



Pobieranie 164.28 Kb.
Strona1/4
Data06.05.2016
Rozmiar164.28 Kb.
  1   2   3   4

Programowanie obiektowe – Klasy i obiekty


1. Pojęcie klasy

1.1. Pojęcia i obiekty
Programowane zorientowane obiektowo polega na tworzeniu aplikacji, złożonych ze współdziałających obiektów. Określenie „obiekt” i „techniki obiektowe” zrobiły w ostatnich latach zawrotną karierę, nie tylko w dziedzinie programowania, ale także baz danych, czy też choćby sztucznej inteligencji. Spróbujmy więc zastanowić się przez chwilę dlaczego obiekty stanowią tak wygodną metodę modelowania rzeczywistości, szturmem wkraczającą w regiony zarezerwowane dotychczas dla dobrze znanych i sprawdzonych metod inżynierii systemowej. Odpowiedź na to pytanie nie jest łatwa. Jako podstawową przyczynę sukcesu technik obiektowych należy chyba wymienić ich intuicyjność oraz dopasowanie do sposobu myślenia człowieka.

Jak bardzo trafnie stwierdzają Martin i Odell [MarOde97]:

„Analiza obiektowa nie jest podejściem modelującym rzeczywistość. Zamiast tego modeluje sposób w jaki ludzie rozumieją i przetwarzają rzeczywistość – przede wszystkim przyswajane przez nich pojęcia”

Człowiek postrzega rzeczywistość przez pryzmat ukształtowanego w jego umyśle aparatu pojęciowego. Pojęcie opisać można poprzez tzw. trójkę pojęciową [MarOde97]:



  • definicja, pomysł lub wytłumaczenie pojęcia (tzw. intensja),

  • zbiór obiektów do których stosuje się pojęcie (tzw. ekstensja),

  • symbol opisujący pojęcie.

Pojęcia umożliwiają więc porządkowanie postrzeganego świata poprzez grupowanie obiektów odpowiadających określonej definicji, oraz przyporządkowanie tak określonej grupie pewnej etykiety lub nazwy (symbolu). Odpowiadać one mogą obiektom fizycznym (np. samochód, dom, towar, itp.) ale również obiektom niematerialnym, abstrakcyjnym (np. sprzedaż, jakość, małżeństwo). Obiekty świata rzeczywistego traktować możemy jako egzemplarze pewnego konkretnego pojęcia.

Nie wszystkie pojęcia muszą zawierać wszystkie wymienione tu elementy. Istnieją pojęcia dla których nie istnieje żaden obiekt, na przykład firma może nie mieć zamówień ani klientów, ale te pojęcia w niej funkcjonują. Mamy również pojęcie perpetuum mobile, mimo że przecież nie może ono istnieć [MarOde97]. Podobnie mogą istnieć pojęcia których nie można opisać jedną krótką etykietą i musimy posługiwać się ich pełną intensją, np. „Zysk ze sprzedaży towarów, usług, lub papierów wartościowych”.

Pojęcia stanowią więc bardzo naturalny sposób modelowania rzeczywistości przez ludzi, a więc również twórców systemów informatycznych. Spróbujmy wiec przyjrzeć się im bliżej, pod kątem sposobów ich formalizacji dla potrzeb programowania.
Prezentacja w PowerPoincie

Reasumując możemy powiedzieć, że do opisu pojęć niezbędny jest typ danych, który łączy zarówno opis jego cech (właściwości) jak i zachowania. Musi więc on grupować razem pola z danymi (atrybuty) oraz kod opisujący dynamiczny aspekt związany z zachowaniem obiektu. Takim typem danych w C++ są właśnie klasy.

Proces identyfikacji atrybutów i wzorców zachowania wspólnych dla grup obiektów (klas) nazywamy abstrakcją danych. Czy oznacza to, że w językach proceduralnych nie mamy do czynienia ze zjawiskiem abstrakcji? Oczywiście nie. W nich również przecież stajemy przed problemem identyfikacji strukturalnych typów danych (rekordów w Pascalu, struktur w C) oraz ich przekształceń. Należy jednak zdawać sobie sprawę z różnic w tej materii między podejściem proceduralnym i obiektowym. W proceduralnym podejściu do projektowania systemów dekomponujemy cały ten proces trzy elementy: algorytmy, przepływ sterowania i opis danych, rozważając każdy z nich w pewnym oderwaniu. W przypadku podejścia obiektowego elementy te rozważane są łącznie. Projektując obliczenia w systemie nie myślimy w kategoriach przekształcania pewnych wejściowych struktur danych na wyjściowe, lecz raczej co dany obiekt może zrobić i jak zachować się reagując na konkretną sytuację.

Taki sposób myślenia jest z całą pewnością bliższy ludziom (zwłaszcza na etapie modelowania) niż metody wypracowane dla potrzeb tradycyjnego podejścia proceduralnego. Nic też dziwnego, że początki obiektowości wiąże się zwykle z językiem Simula, wyspecjalizowanym do zagadnień modelowania i symulacji. Twórca C++ Bjarne Stroustrup wyraźnie stwierdza, że mechanizm dziedziczenia (który jak zobaczymy dalej jest wyróżnikiem obiektowości) został zapożyczony właśnie z tego języka [Strou95 s.36]. Powstaje tym niemniej pytanie: Czy wystarczy to dla osiągnięcia takiej popularności, jaką zdobyło sobie C++? Simula nie zdobyła sobie przecież szerszego rozgłosu.

Bez wątpienia C++ wiele zawdzięcza właściwościom zapożyczonym z C. Wydaje się jednak również, że język ten trafił po prostu w swój czas, kiedy zaczęły być istotne również inne aspekty, powodujące atrakcyjność obiektowego podejścia do budowy systemu. Powiedzieliśmy już na wstępie, że aplikacja obiektowa składa się ze współdziałających obiektów. Niejako z definicji jest więc ona rozbita na wiele drobnych komunikujących się między sobą elementów. Daje to szereg bardzo istotnych korzyści płynących z zastosowania modelu obiektowego:


  • umożliwia on tworzenie aplikacji ewoluujących w czasie. Dokonywanie modyfikacji systemu jest stosunkowo proste i zwykle ogranicza się do jej niewielkiego wycinka (obiektu lub grupy obiektów). Stosunkowo luźne powiązania między fragmentami aplikacji powodują że większa jej część zwykle w ogóle nie musi być modyfikowana.

  • ponieważ obiekty są pewnymi zamkniętymi całościami, model obiektowy umożliwia w bardzo szerokim zakresie wielokrotne wykorzystanie zarówno kodu jak i projektów. Dotyczy to nie tylko bezpośredniego transferu kodu obiektów, ale przede wszystkim bibliotek. Biblioteki obiektowe to potężne ale i bardzo elastyczne narzędzia. Z jednej strony realizują one automatycznie bardzo poważne zadania, pozwalając jednak w łatwy i naturalny sposób na selektywną zmianę swego zachowania w wybranych przez użytkownika (oraz projektanta biblioteki) aspektach.

  • systemy obiektowy w łatwy i naturalny sposób może być osadzany w nowoczesnym, rozproszonym środowisku operacyjnym. Aplikacja ma przecież z natury charakter w zasadzie rozproszony (przy dobrym projekcie). Przenoszenie z platformy jednostanowiskowej na rozproszoną może wiązać się jedynie z modyfikacją protokołów komunikowania się (przekazywania zdarzeń) między obiektami.

W rozwoju popularności technik obiektowych i C++ nie bez znaczenia jest również rozwój nowoczesnych platform systemowych, oraz środowisk graficznych. Te przyjazne dla użytkownika systemy operacyjne stanowią bardzo poważne wyzwanie dla twórców aplikacji (wie o tym ktoś kto robił cokolwiek w Win API). To właśnie metody obiektowe pozwalają na opanowanie tego środowiska, ułatwiając w nim pracę (czasem do poziomu banalności jak w przypadku prostych aplikacji w Visual Basicu). Nie bez znaczenia jest również, że coraz częściej same systemy operacyjne mają charakter obiektowy. Standardy specyfikacyjne takie jak COM (Compound Object Model) oraz jego rozwinięcia implementacyjne (OLE, Active-X) w MS Windows, pozwalają na osadzanie obiektów bezpośrednio w systemie operacyjnym.

Można więc powiedzieć, że podstawy popularności C++ mają dwojaki charakter: z jednej strony implementuje ono obiektowe podejście do budowy systemów, pozwalające na wykorzystanie technik modelowania pojęciowego, z drugiej strony jest to język niezwykle efektywny w tworzeniu różnorakich typów roboczych oraz mechanizmów narzędziowych usprawniających działanie aplikacji oraz jej porozumiewanie się z systemem operacyjnym. Obydwa te aspekty zostały przez nas uwzględnione w dalszych rozdziałach. Należy przy tym wyraźnie stwierdzić, że wszystko co można zrobić w C++ można zrobić również w językach proceduralnych, na przykład w C. Jednakże efektywność tych rozwiązań oraz nakłady pracy i wysiłku niezbędne do ich uzyskania mogą być tak duże, że w praktyce uniemożliwiają ich realizację.

1.2. Abstrakcja danych w C++


  1   2   3   4


©absta.pl 2016
wyślij wiadomość

    Strona główna