Obiektowe modelowanie I analiza



Pobieranie 51,78 Kb.
Data22.02.2018
Rozmiar51,78 Kb.

Obiektowe modelowanie i analiza

Podejście obiektowe zyskuje sobie coraz większą popularność. Podejście to może być stosowane na różnych etapach rozwoju systemu. Najwcześniejsze jego wykorzystanie dotyczy specyfikacji wymagań, gdzie model obiektowy może być użyty do przedstawienia dziedziny problemowej i wypowiedzenia wymagań związanych z jej strukturą i oczekiwanymi zachowaniami. Tak więc modelowanie obiektowe stanowi jedną z technik reprezentowania wymagań (chociaż nie umożliwia wypowiadania wszystkich rodzajów wymagań). Powstałe w ten sposób modele mogą być poddane zabiegom analitycznym, w wyniku których zostają wykryte a następnie usunięte, sprzeczności i braki w wymaganiach. Jest to szczególnie ważna własność podejścia obiektowego, gdyż wczesne usunięcie defektów wymagań pozwala uniknąć znacznych zagrożeń projektu na dalszych etapach jego rozwoju. Modele obiektowe dotyczące wymagań mogą być dalej rozwijane i wzbogacane, poprzez odwzorowywanie w nich kolejnych decyzji projektowych, co prowadzi do kolejnych, bardziej szczegółowych, reprezentacji budowanego systemu. Następnie obiektowy projekt systemu może być odwzorowany w reprezentację w wybranym języku programowania. Jeżeli język ten ma również orientację obiektową (tzn. umożliwia jawną reprezentację obiektów i ich własności), to przejście od projektu do implementacji jest znacznie łatwiejsze. Należy jednak podkreślić, że obiektowość docelowego środowiska programowania nie jest wymogiem koniecznym; projekt obiektowy może być również implementowany w języku tradycyjnym (np. C) lub z wykorzystaniem relacyjnego systemu bazy danych, chociaż wtedy jest to zabieg bardziej złożony i w konsekwencji bardziej narażony na błędy.

W ramach cyklu życia oprogramowania podejście obiektowe ma szeroki zakres stosowalności, od specyfikacji wymagań po implementację. Stanowi to jeden z najsilniejszych argumentów na rzecz stosowania tego podejścia przy wytwarzaniu oprogramowania: obiektowość umożliwia „przeprowadzenia” projektu poprzez pokazaną na rysunku lukę semantyczną pomiędzy pierwotnym sformułowaniem problemu a odpowiadającym mu rozwiązaniem. Przejście to jest dokonywane w serii kolejnych dobrze zdefiniowanych kroków, z których wszystkie wykorzystują tę samą bazę pojęciową (obiekty, ich atrybuty i wiązania pomiędzy nimi).

Modelowanie obiektowe jest szczególnie użyteczne jako sposób bardziej dogłębnej identyfikacji rozwiązywanego problemu. Modelowanie jest naturalnym środkiem do lepszego zrozumienia modelowanego przedmiotu. Siła modelowania bierze się z możliwości odróżnienia cech ważnych od nieistotnych i skoncentrowaniu się tylko na tych pierwszych. W ten sposób model staje się prostszy od odpowiadającego mu fragmentu rzeczywistości, a tym samym łatwiejszy w badaniu i zrozumieniu. Jeżeli (pomimo uproszczeń) model wciąż reprezentuje wszystkie istotne cechy swego pierwowzoru, analiza modelu dostarczy prawdziwych odpowiedzi na interesujące nas pytania. W szczególności jeżeli model zachowuje strukturę rzeczywistego problemu, może służyć do wizualizacji szeregu idei, które w przeciwnym razie musiałyby być przekazane w formie opisowej. Tak więc modele mogą też służyć poprawie komunikowania się pomiędzy ludźmi. Jest to szczególnie ważne w inżynierii oprogramowania, gdyż komunikacja między różnymi grupami ludzi (klienci, użytkownicy, analitycy, projektanci, programiści itd.) jest nieunikniona i intensywna. Modele mogą być również badane eksperymentalnie (testowane) po to, aby dowiedzieć się więcej na temat modelowanego systemu, zanim dojdzie do jego realizacji.

Na rysunku przedstawiono miejsce podejścia obiektowego (obszar zacienony) w ramach etapów wytwarzania oprogramowania. Coraz bardziej regularny kształt bloków tego diagramu obrazuje postępujący wzrost zrozumienia rozwiązywanego problemu. Należy jednak podkreślić, że rysunek ten nie powinien być interpretowany w terminach temporalnych, tzn. kolejność przedstawionych etapów nie musi odpowiadać ich kolejnej realizacji w czasie. Jest to raczej kolejność logiczna, tzn. rezultaty etapu wcześniejszego stanowią podstawę do podjęcia prac nad realizacją etapu następnego.

Świat obiektów

Podejście obiektowe opisuje rzeczywistość z trzech różnych perspektyw (rysunek): strukturalnej, behawioralnej i transformacyjnej. Każda z nich dotyczy innego aspektu modelowanego świata i jest reprezentowana przez inny model. Możemy więc oczekiwać, że każdy z tych modeli składowych będzie w znacznym stopniu prostszy od całości modelowanego problemu, ponieważ koncentruje się jedynie na wybranych cechach.



Perspektywa

strukturalna

Perspektywa

behawioralna

Perspektywa

transformacyjna


Rys. 3. Perspektywy modelowania obiektowego

Z perspektywy strukturalnej interesują nas przede wszystkim trwałe własności modelowanej rzeczywistości. Podstawą modelu jest obiekt i klasa obiektów. Model rozróżnia grupy obiektów i trwałe wiązania występujące pomiędzy nimi. Z tego względu, model ten jest często nazywany modelem obiektów lub modelem klas.

Przyjmując perspektywę behawioralną, koncentrujemy się na interakcjach obiektów. Kluczowym dla tej perspektywy jest pojęcie zdarzenia, a tworzony model reprezentuje zdarzenia, które są generowane przez obiekty spontanicznie lub w odpowiedzi na zdarzenia generowane przez inne obiekty. Model ten nosi nazwę modelu dynamicznego, gdyż reprezentuje dynamikę modelowanej rzeczywistości.

Z perspektywy transformacyjnej zainteresowani jesteśmy przekształceniami danych i związanymi z tym zależnościami wejść i wyjść. Podstawowe pojęcia tego modelu to transformacja danych (lub funkcja albo proces), a model przedstawia przepływy danych i przekształcenia, którym one są poddawane. Model ten nosi nazwę modelu funkcjonalnego.

Powyższe trzy modele koncentrują się na przedstawieniu różnych aspektów dziedziny aplikacyjnej, z uwzględnieniem skutków wynikających z wbudowania w nią (przyszłego) systemu komputerowego. Modele te mogą być dodatkowo uzupełnione przez model usług, który prezentuje system komputerowy z perspektywy jego użytkowników. Model ten jest wyrażany w postaci zbioru przypadków użycia systemu (ang. use case), a każdy taki przypadek opisuje ciąg interakcji pomiędzy systemem i jego otoczeniem, mający znaczenie z punktu widzenia użytkowników systemu (np. przypadek użycia systemu rezerwacji miejsc lotniczych może opisywać interakcje składające się na obsługę pojedynczego klienta biura linii lotniczych).

Ponieważ wszystkie powyższe modele dotyczą tej samej rzeczywistości, muszą one być między sobą spójne. Badanie związków spójności jest jednym z rodzajów analiz, które powinny być dokonane w celu weryfikacji procesu modelowania.
Perspektywa strukturalna - model obiektów

Model obiektów reprezentuje strukturę systemu w terminach obiektów i występujących pomiędzy nimi powiązań. Podstawowym celem modelu jest wierne odwzorowanie struktury rozpatrywanego problemu aplikacyjnego. Ma to swój wyraz w stosowanym nazewnictwie - nazwy obiektów pochodzą z modelowanej dziedziny aplikacyjnej. Tak więc budując model związany z dziedziną telekomunikacji, do reprezentowania interesujących nas obiektów będziemy używać terminów takich jak „abonament”, „łącze abonenckie” czy „łącze międzycentralowe”, podczas gdy modelując system zabezpieczeń przeciwpożarowych budynku, użyjemy nazw „pomieszczenie”, „czujnik” czy „alarm”. Należy zaznaczyć, że nie istnieją kryteria dla „najlepszej” dekompozycji danego problemu aplikacyjnego na obiekty - wybór w znacznym stopniu zależy od oceny osoby modelującej, jej doświadczenia oraz przewidywanych sposobów wykorzystania modelu.

Podstawowymi składowymi modelu obiektów są:


  • obiekty,

  • klasy obiektów,

  • atrybuty,

  • operacje i metody,

  • związki i wiązania.

Obiekty są to fizyczne lub logiczne (abstrakcyjne) elementy występujące w dziedzinie problemowej. Służą one do dwóch celów: umożliwiają zrozumienie problemu podlegającego rozwiązaniu oraz, w dalszej perspektywie, są implementowane środkami sprzętowymi i programowymi, a więc stają się częścią rozwiązania tego problemu. Przy wyborze obiektów, które trafią do modelu, należy zadbać o to, by reprezentowały te elementy modelowanego świata, które są w nim wyraźnie wyróżnione i zachowują swoją tożsamość niezależnie od przekształceń, którym podlegają. Przykładami obiektów mogą być: „student UWM”, „rozmowa telefoniczna”, „aparat telefoniczny” czy „zarząd firmy F”. Obiekty mogą świadczyć usługi innym obiektom, które stają się ich klientami. Klienci postrzegają dany obiekt poprzez zestaw oferowanych przez niego usług. W ten sposób, oferując różne zestawy usług, obiekt jest postrzegany różnie przez różne grupy klientów - „widzą” oni różne abstrakcje danego obiektu. Dla przykładu aparat telefoniczny jest inaczej postrzegany przez obiekt-osobę, która wykonuje rozmowy telefoniczne, a inaczej przez obiekt-osobę która dokonuje napraw serwisowych tego aparatu. Wykonanie określonej usługi może pozostawić ślad w obiekcie, np. naprawa powoduje, że niesprawny aparat telefoniczny jest ponownie zdatny do użytku. Abstrakcyjny obraz obiektu postrzegany przez inne obiekty (jego klientów), jest charakteryzowany przez zestaw usług i stan. Usługi mogą modyfikować stan, co pozostawia w stanie obiektu ślady obserwowane (za pośrednictwem usług) przez inne obiekty.

Klienci kontaktują się z obiektem wyłącznie poprzez wywoływanie jego usług. Wywołanie takie identyfikuje usługę jest wiązane z odpowiednią operacją, która tę usługę identyfikuje. Z punktu klienta mechanizm ten jest nieistotny, jest on jedynie zainteresowany otrzymaniem wywołanej usługi. W tym sensie obiekt jest hermetyczny, tzn. konkretny sposób dostarczenia wywołanej usługi jest „wewnętrzną” sprawą obiektu. Wraz z wywołaniem usługi mogą być przekazane parametry wywołania, a po zakończeniu klient może otrzymać rezultaty danego wywołania. W szczególności parametr lub rezultat wywołania usługi mogą identyfikować inny obiekt. W momencie wywołania usługi musi być wskazany co najmniej jeden obiekt: obiekt który tę usługę świadczy (obiekt docelowy). Zakłada się, że każdy obiekt ma swój jednoznaczny wskaźnik, który służy jego identyfikacji. Pozostaje on niezmienny nawet wtedy, gdy zmienia się stan obiektu. Dzięki temu obiekt może „ewoluować” w czasie, nie tracąc swojej tożsamości. Obiekt ma swój okres istnienia, który jest wyznaczony przez okres istnienia jego wskaźnika, tzn. powołanie obiektu do życia jest równoznaczne z utworzeniem jego wskaźnika, a likwidacja obiektu oznacza likwidację jego wskaźnika (od tego momentu wskaźnik nie może być użyty przez żaden inny obiekt, a więc dany obiekt staje się niedostępny). Wywołanie usługi przez klienta nie musi jawnie identyfikować docelowego obiektu, wybór ten może wynikać z kontekstu wywołania i jest rozstrzygany w trakcie wiązania wywołania z wykonaniem odpowiadającej mu operacji.

Ta sama usługa może być oferowana przez różne obiekty i w związku z tym może dawać różne efekty. Te operacje, których znaczenie zmienia się w zależności od kontekstu wykonania, nazywane są operacjami ogólnymi (ang. generic).

Użyteczne jest również rozróżnienie pomiędzy obiektami pasywnymi i aktywnymi, gdzie te ostatnie zdolne są do spontanicznego wywołania usług, podczas gdy obiekty pasywne robią to jedynie w odpowiedzi na żądanie wykonania własnych usług, otrzymane od innych obiektów.

Zestaw oferowanych usług stanowi interfejs obiektu do innych obiektów. Określa on, w jaki sposób klienci mogą używać danego obiektu. Grupa obiektów może mieć wspólną definicję formatu danych wykorzystanych do definicji interfejsu. W takiej sytuacji, każdy z obiektów tej grupy stanowi wcielenie (instancję) wspólnej definicji, a grupa ta nazywa się klasą obiektów. Należy jednak pamiętać, że chociaż obiekty współdzielą ten sam format (definicję), ich stany mogą być różne (każdy z nich ma własną pamięć stanu). Wspólna definicja określa klasę posiadającą zbiór różnych wcieleń. Dla przykładu, współdzielona może być również implementacja usług, podczas gdy dane (reprezentujące stan obiektów), używane przy realizacji usług, pozostają różne dla różnych obiektów. W ogólnym przypadku, współdzielenie może dotyczyć zarówno usług jak i stanu. Używane jest tu pojęcie dziedziczenia (ang. inheritance), które oznacza, że obiekt nowo utworzonej klasy współdzielą elementy stanu i usługi zdefiniowane w innej klasie (w ten sposób nowa klasa dziedziczy definicję innej klasy i rozszerza ją o nowe elementy). Na poniższym rysunku podano przykład klasy Telefon. Klasę reprezentujemy w postaci prostokąta podzielonego na trzy obszary: nazwę klasy, jej atrybuty oraz związane z nią operacje. Obiekt przedstawiono w postaci konturu owalnego, podzielonego na dwa obszary: nazwę klasy (w nawiasach) oraz wartości przypisane atrybutom.



Telefon


numer

podnieś_słuchawkę

wybierz_numer

odłóż_słuchawkę

Rys. Klasa Telefon

Pojęcie klasy umożliwia wyróżnienie grupy obiektów, które są do siebie „podobne”, według pewnego kryterium. Odwołuje się ono do cech tych obiektów (ich atrybutów i operacji). Obiekty należące do tej samej klasy mają niektóre cechy wspólne. Jednakże samo podobieństwo strukturalne nie jest wystarczające do zaliczenia pary obiektów do tej samej klasy. Klasa powinna mieć jasny cel uzasadniający jej istnienie. Jest on związany z kontekstem, w ramach którego klasa jest używana. Klasyfikacja obiektów (grupowanie ich w klasach) jest podstawową metodą wprowadzania do modelu pojęć abstrakcyjnych (klasa jest abstrakcją reprezentującą obiekty będące jej wcieleniami).

Atrybuty to te cechy obiektów, które mogą być charakteryzowane wartościami danych. Na przykład: kolor, waga czy cena to atrybuty obiektu aparat telefoniczny. Różne mogą mieć różne wartości tych atrybutów. Ponieważ atrybuty są w pełni charakteryzowane przez wartości danych, nie są obiektami w tym sensie, że nie mają tożsamości, niezależnej od przypisanej im wartości. Wystąpienia wartości „czerwony” w atrybutach kolor dwóch różnych obiektów są nierozróżnialne.

Operacje mogą służyć dwóm celom: operacja może próbkować (testować) wartość atrybutu obiektu lub przekształcać (zmieniać) wartości przypisane tym atrybutom. Możliwe jest również łączne wystąpienie obu powyższych efektów w ramach jednej operacji. Te operacje, które nie zmieniają wartości atrybutów obiektu są również nazywane zapytaniami. Jeżeli operacja-zapytanie zwraca wartość, która została obliczona na podstawie wartości atrybutów obiektu, wartość tę można traktować jako wartość nowego atrybutu, wywiedzionego z już istniejących (atrybut ten nie jest niezależny od innych). Wszystkie obiekty danej klasy współdzielą te same operacje. Każde wywołanie operacji ma przypisany mu niejawnie obiekt docelowy, tzn. obiekt, którego atrybutów operacja dotyczy. Ilość argumentów operacji, ich typy oraz typ wartości zwracanej przez operację, stanowią sygnaturę tej operacji.

Operacje ogólne to te, które odnoszą się do różnych klas obiektów. W odniesieniu do każdej z tych klas operacja taka może zachowywać się inaczej, w zależności od jej lokalnej definicji. Definicja ta określa metodę realizacji tej operacji w ramach danej klasy. Z punktu widzenia modelowania ważne jest jednak, aby wszystkie metody realizacji danej operacji były tworzone ze wspólną intencją, a ich zróżnicowanie wynikało jedynie z różnych warunków lokalnych (związanych z poszczególnymi klasami). Zauważmy, że zróżnicowanie metod realizacji operacji nie tworzy zagrożenia niejednoznacznością przy wywołaniu. Przy wywołaniu operacji znany jest obiekt docelowy, a więc jest również jednoznacznie określona metoda wykonania operacji.

W języku graficznym, klasy reprezentowane są następująco:






Nazwa_klasy


Nazwa_atrybutu: typ_danych = wartość_domyślna

Nazwa_operacji (lista argumentów): typ_wyniku

Rys. Graficzna reprezentacja klasy obiektów


W rzeczywistym świecie obiekty często są powiązane ze sobą zależnościami (np. osoba może być właścicielem obiektu samochód). Zależność tę reprezentuje wiązanie (ang. link) pomiędzy rozważanymi obiektami. Grupę takich wiązań, mających ten sam sens i strukturę, nazwiemy związkiem (ang. association). Związki występują pomiędzy klasami, a odpowiadające im wiązania, pomiędzy obiektami klas. Tak więc pomiędzy klasami osoba i samochód występuje związek właściciel, podczas gdy pomiędzy konkretną osobą i konkretnym samochodem może wystąpić wiązanie wyrażające stosunek własności danej osoby do rozważanego samochodu. Związek może łączyć ze sobą wiele klas. W praktyce mamy do czynienia najczęściej ze związkami binarnymi ternarnymi (łączącymi trzy klasy). Związek jest najczęściej dwukierunkowy, tzn. może być sensownie odczytywany wychodząc z dowolnej z uczestniczących w nim klas. W praktyce często występują trudności z doborem nazw związków umożliwiających ich odczyt w dowolnym kierunku. Dla przykładu: związek Pracuje_w pomiędzy klasami Osoba i Firma daje się sensownie odczytać przy przejściu od klasy Osoba do klasy Firma, ale brzmi bezsensownie przy przejściu od Firmy do Osoby. Dlatego stosuje się dodatkowo oznaczenie ról pełnionych przez klasy uczestniczące w związku. W rozważanym przypadku, przypisanie osobie roli pracownik, a Firmie roli pracodawca, usuwa trudności interpretacyjne. Zauważmy również, że nazwy ról mogą być równocześnie traktowane jako nazwy cech przypisanych odpowiednim obiektom: dla danej firmy, pracownik reprezentuje zbiór osób zatrudnionych w tej firmie, a dla danej osoby, pracodawca reprezentuje firmę zatrudniającą tę osobę. Cechy te nie są atrybutami, gdyż przypisane im są obiekty, a nie wartości danych. Zastosowanie nazw ról jest szczególnie wygodne gdy związek dotyczy obiektów tej samej klasy.

W reprezentacji graficznej związki przedstawiane są jako linie łączące klasy. W ogólności związek może definiować zależność wielu-do-wielu, pomiędzy obiektami łączącymi klas. Ograniczenia w tym zakresie mogą być dokonane przez podanie krotności związku. Krotność mówi nam ile obiektów danej klasy jest równocześnie związanych z obiektem innej klasy, objętej tym samym związkiem.

Pojęcia związku i wiązania nie powinny być mylone z pojęciem odsyłacza (ang. pointer), który jest specyficzne dla języków programowania. Odsyłacze mogą być zastosowane przy implementacji wiązań pomiędzy obiektami. Należy jednak pamiętać, że jest to jedynie specyficzny, jeden spośród wielu możliwych, środków implementacji. Związki i powiązania są pojęciami z poziomu modelowania i są niezależne od wybranego sposobu ich implementacji.

Wiązania są wcieleniami związków, tak jak obiekty są wcieleniami klas. Występuje tu jednak istotna różnica, ponieważ wiązanie nie może istnieć niezależnie od objętych nim obiektów. W odróżnieniu od tego, obiekt jest w pełni autonomiczny i jego istnienie nie jest objęte żadnymi dodatkowymi warunkami.

Wiązania mogą być charakteryzowane atrybutami. Stosujemy to wtedy, gdy dany atrybut nie może być przypisany żadnemu z obiektów objętych wiązaniem. Rozpatrzmy dla przykładu wiązanie pomiędzy obiektami klas Plik i Użytkownik. Wiązanie to może posiadać atrybut prawa dostępu. Atrybut ten nie może być przypisany żadnemu z obiektów, ponieważ odpowiedni związek pomiędzy tymi klasami jest typu wielu-do-wielu (użytkownik może mieć dostęp do wielu plików, z różnymi prawami dostępu, a plik jest dostępny wielu użytkownikom). W ogólnym przypadku związek może być modelowany jako klasa z własnymi atrybutami i operacjami. Operacje tej samej klasy mogą być wywoływane przez inne obiekty oraz może ona wychodzić w związki z innymi klasami.

W przypadku związków wielu-do-jednego i wielu-do-wielu zdarza się, że obiekty występujące po jednej stronie związku mogą być jednoznacznie identyfikowane na bazie wartości wyróżnionego atrybutu. Rozpatrzmy dla przykładu związek między Katalogiem i Plikiem. W niektórych systemach jest to związek jeden-do-wielu, w innych wielu-do-wielu. Jednakże, w ramach ustalonego katalogu, plik jest jednoznacznie rozróżnialny na podstawie swojej nazwy. Powiemy wtedy, że nazwa pliku jest w rozważanym związku jego kwalifikatorem.

Kwalifikacja dotyczy sytuacji, gdy dany obiekt (w naszym przykładzie katalog) określa kontekst, w ramach którego możliwe jest, na podstawie wyróżnionej cechy, jednoznaczne rozróżnianie obiektów należących do innej klasy.

Dwa rodzaje związków pełnią szczególną rolę w modelowaniu obiektowym. Są to dekompozycja i specjalizacja.

Dekompozycja reprezentuje zależność pomiędzy całością i jej składnikami. Dekompozycja ma dodatkowe własności w stosunku do ogólnych związków. Jest ona przechodnia (jeżeli B jest częścią A wtedy części B są również częściami A) oraz asymetryczna (A nie może być częścią żadnej ze swoich części). W praktyce modelowania występuje czasem potrzeba przestawienia dekompozycji rekursywnej, np. w sytuacji, gdy program jest przedstawiany w postaci bloków, które mogą być dalej dekomponowane na mniejsze bloki. W przypadku dekompozycji niektóre cechy całości ulegają propagacji do jej części składowych, np. przesunięcie całości oznacza przesunięcie wszystkich jej części. Dopuszcza się również, że podczas propagacji może nastąpić lokalna (tzn. w ramach danej części) modyfikacja propagowanej własności.

W notacji graficznej dekompozycja jest przedstawiona tak jak związek, z tym że po stronie „całości” umieszczony jest nieduży romb. Jeżeli występuje dekompozycja na wielu różnych (rozłącznych) klas, poszczególne związki mogą być złączone i przedstawione w postaci drzewa dekompozycji. Cechy (głównie operacje), które podlegają propagacji poprzez dekompozycję, przedstawiane są jako etykiety odpowiednich związków (nazwa danej cechy i strzałka wskazująca kierunek propagacji).
Specjalizacja oznacza zależność typu „A-jest-B”. Umożliwia ona modelowanie podobieństw pomiędzy klasami. Specjalizacja występuje pomiędzy daną klasą (nazywaną klasą nadrzędną) oraz jej uszczegółowieniem (nazywanym klasą podrzędną). Dzięki temu przy definiowaniu klasy podrzędnej nie musimy powtarzać cech przypisanych klasie nadrzędnej. Zamiast tego klasa podrzędna dziedziczy cechy klasy nadrzędnej, poprzez związek specjalizacji. Specjalizacja (lub uogólnienie, jeżeli patrzymy od strony klas podrzędnych w kierunku klas nadrzędnych) tworzy hierarchię o dowolnej liczbie poziomów. Dziedziczenie w ramach tej hierarchii jest przechodnie. W odniesieniu do hierarchii dziedziczenia często używa się określeń przodek i potomek w stosunku do klas, których cechy są dziedziczone, oraz klas, które te cechy dziedziczą. Obiekty klasy występującej w hierarchii dziedziczenia jest jednocześnie obiektem każdej z klas-przodków i posiada (dziedziczy) wszystkie cechy (operacje i atrybuty) tych przodków. Każda klasa w hierarchii może dodawać nowe cechy do tych, które są dziedziczone od jej przodków.

W notacji graficznej specjalizacja oznaczana jest w postaci trójkąta, gdzie klasa nadrzędna jest po stronie wierzchołka, a klasy podrzędne - po stronie podstawy. Jeżeli klas podrzędnych jest więcej, podstawa trójkąta jest odpowiednio przedłużana.

Specjalizacja prowadząca do wyróżnienia kilku (rozłącznych) klas podrzędnych jest zwykle dokonywana w odniesieniu do wyróżnionego atrybutu klasy nadrzędnej. Atrybut ten (nazywany atrybutem wyróżniającym lub wyróżnikiem) zwykle ma charakter wyliczeniowy. Różnym wartościom wyróżnika odpowiadają różne klasy podrzędne. Jeżeli wszystkie wartości wyróżnika są związane z klasami podrzędnymi, dana klasa nadrzędna jest abstrakcyjna w tym sensie, że nie ma obiektów będących jej wcieleniami, które nie są równocześnie wcieleniami pewnych jej potomków. Klasa, która nie jest abstrakcyjna, jest klasą konkretną. Klasy abstrakcyjne są powszechnie używane w celu zdefiniowania cech, które są wspólne dla wszystkich ich potomków.

Klasa podrzędna rozszerza (tzn. dodaje nowe do już istniejących) cechy dziedziczone od swych przodków. W pewnych sytuacjach klasa może przesłonić cechę dziedziczoną od przodka poprzez zdefiniowanie nowej cechy o takiej samej nazwie. Wtedy nowa cecha (najczęściej jest to operacja) powinna zachować sygnaturę operacji zastępowanej. Potrzeba przesłaniania może wynikać z konieczności specjalizacji danej operacji, poprzez zdefiniowanie jej w sposób zależny od lokalnej specyfikacji klasy dziedziczącej, np. w celu zapewnienia lepszej efektywności. Przesłanianie jest również środkiem do ograniczenia zbioru wartości, które mogą występować w obiektach klasy podrzędnej, w celu wykluczania tych układów wartości które są sprzeczne z ogólną charakterystyką danej klasy. Weźmy na przykład klasę Elipsa i jej specjalizację Okrąg. Zastosowanie operacji przeskalowania, dziedziczonej z klasy Elipsa, powinno być w klasie Okrąg ograniczone tak, aby chronić obiekty tej klasy przed „wyrzuceniem ich” poza klasę na skutek niesymetrycznego przeskalowania.


Perspektywa behawioralna - model dynamiczny

Model obiektowy przedstawia strukturę obiektów oraz ich wzajemne powiązania. Dla każdego obiektu wartości przypisane jego atrybutom oraz wiązania tego obiektu z innymi obiektami, definiują stan tego obiektu. Przyjmujemy, że stan jest jednoznacznie zdefiniowany w każdym momencie czasu (tzn. zmiany wartości atrybutów jak i zmiany wiązań pomiędzy obiektami zachodzą natychmiastowo - nie ma możliwości „zauważenia” stanów pośrednich). Zmiany stanu obiektów zachodzą pod wpływem zdarzeń (ang. events). Celem modelu dynamicznego jest opisanie, w jaki sposób stan obiektów może podlegać zmianom w odpowiedzi na pojawiające się zdarzenia oraz w jaki sposób zdarzenia te są wytwarzane.



©operacji.org 2017
wyślij wiadomość

    Strona główna