Obiektowe modelowanie systemów informatycznych



Pobieranie 8,01 Mb.
Strona4/113
Data23.10.2017
Rozmiar8,01 Mb.
1   2   3   4   5   6   7   8   9   ...   113

Klasy


Pojęcia klasy oraz obiektu są połączone pomiędzy sobą. Klasa to jest abstrakcja istotnych cech (właściwości oraz operacje) zbioru obiektów o zbliżonych własnościach. Innymi słowy klasa to jest opis obiektów, które mają te same właściwości, operacje oraz semantykę. Jakikolwiek obiekt jest egzemplarzem klasy. Klasa zawiera się reprezentację wewnętrzną oraz reprezentację zewnętrzną. Reprezentacja wewnętrzna nazywa się realizacją klasy. Reprezentacja zewnętrzna nazywa się interfejsem klasy. Interfejs składa się z sygnatur wszystkich metod, zmiennych i konstant, które mogą być użyte w stosunku do obiektów egzemplarzy tej klasy. Interfejs może być podzielony na trzy części:

  • Publiczna (public) – która jest dostępna wszystkim klientom - obiektom innych klas;

  • Zabezpieczona (protected) – która jest dostępna obiektom tej samej klasy, obiektom podklasy oraz obiektom klasy zaprzyjaźnionej (friend class);

  • Prywatną (private) – która jest dostępna tylko obiektom tej samej klasy oraz obiektom klasy zaprzyjaźnionej.

Klasa zaprzyjaźniona to jest klasa, która posiada dostęp do wszystkich części tej klasy – publicznej, zabezpieczonej oraz prywatnej.

Związki

Związek to jest relacja między klasami. W modelowaniu obiektowym najważniejszymi rodzajami związków są :



  1. Asocjacja;

  2. Dziedziczenie i uogólnienie;

  3. Agregacja;

  4. Zależność.

Asocjacja (association) wyznacza związek semantyczny pomiędzy różnymi klasami obiektów. Asocjacja to jest „klej”, który jednoczy się wszystkie elementy systemu. Semantyką asocjacji jest pewna liczba „nitek” (powiązań) łączących obiekty będące wystąpieniami klas połączonych przez asocjację. Bez asocjacji system jest zbiorem izolowanych klas.

Klasa biorąca udział w asocjacji odgrywa pewną określoną rolę. Role to jest „oblicze”, które klasa przy jednym końcu powiązania prezentuje klasie przy drugim końcu.

Na rys.8 jest pokazany przykład asocjacji „jeden do wielu” pomiędzy klasą „Firma” oraz klasą „Osoba”.

Rys.8


Asocjacja zawiera powiązania w dowolnym kierunku. To znaczy, że:

  • Dla każdego egzemplarzy klasy „Osoba” jest wyznaczony jeden egzemplarz klasy „Firma”, w którym pracuje osoba;

  • Dla każdego egzemplarzy klasy „Firma” są wyznaczone wszystkie osoby, zatrudnione w tej firmie.

Asocjacja reprezentuje związek strukturalny między obiektami. To znaczy, że trzeba wyznaczyć ilość obiektów, które mogą być połączone przez jeden egzemplarz powiązania. Ta ilość nazywa się liczebnością roli asocjacji. Liczebność podana przy jednym końcu asocjacji wskazuje, ile obiektów tej samej klasy musi być połączone z każdym obiektem klasy znajdującej się na końcu przeciwnym. Liczebność można ustalić na dokładnie jeden(1), zero lub jeden(0..1), dowolnie wiele (0..*) albo co najmniej jeden (1..*). Może to być także inna pewna ustalona liczba.

Asocjacja umożliwia przechodzenie(nawigację) pomiędzy powiązanymi obiektami w dowolnym kierunku, dlatego asocjacja jest utożsamiana z powiązaniami wskaźnikowymi przy realizacji tych obiektów. Przykład realizacji wyższe pokazanych klas w środowisku JAVA jest pokazany w następnym listingu:

Listing.2 /***********************************************************************


  • Module: Firma.java

  • Author: hadginov

  • Purpose: Defines the Class Firma ***********************************************************************/

import java.util.*;

public class Firma

{

public Osoba [] zatrudnia;



}

/***********************************************************************



  • Module: Osoba.java

  • Author: hadginov

  • Purpose: Defines the Class Osoba_ ***********************************************************************/

import java.util.*;

public class Osoba



{

public Firma pracuje;



}
Dziedziczenie (inheritance) i uogólnienie (generalization). Dziedziczenie to jest związek pomiędzy klasami obiektów określający przekazywanie cech (definicji atrybutów, metod, itd.) z nadklasy do jej podklas. Dziedziczenie realizuje związek typu „jest” (hierarchią „is a”). Np. (Rys.9) obiekt klasy „Pracownik” dziedziczy wszystkie własności (definicje atrybutów, metody) określone w ramach klasy „Osoba”.

Rys. 9


Dziedziczenie jest podstawowym mechanizmem sprzyjającym ponownemu użyciu rezultatów projektowania. Dziedziczenie często nazywają innym terminem Uogólnieniem lub Generalizacją. Przykład skryptów wyższe pokazanych klas w środowisku JAVA jest pokazany w listingu 3:

Listing 3

/***********************************************************************


**********************************************************************/

import java.util.*;

public class Osoba

{

public String Nazwisko;



public String Imie;

public int RokUrodz;

public int Wiek()

{

// TODO: implement



return 0;

}

}



/***********************************************************************

  • Module: Pracownik.java

  • Author: hadginov

  • Purpose: Defines the Class Pracownik ***********************************************************************/

import java.util.*;

public class Pracownik extends Osoba

{

public int Zarobek;



public int Firma;

public int ZarobekNetto()

{

// TODO: implement



return 0;

}

public int ZminZarobek()



{

// TODO: implement

return 0;

}

}



Hierarchia dziedziczenia nie musi kończyć się na dwóch poziomach. Podklasa (subclass) jednej klasy może być nadklasą (superclass) innej klasy. Podklasa często ma własne nieodziedziczone atrybuty. Na przykład klasa „Ssak” dziedziczy klasę „Zwierzę”. Ale oddzielny „Ssak” ma włosy i daje mleko, oraz nie są to cechy odziedziczone z klasy „Zwierzę”.

Podklasy są ważną częścią modelu, gdyż ostatecznie są potrzebne egzemplarzy tych klas. W tym celu jest wykorzystywana klasa abstrakcyjna (abstract class), która zawiera własności (np. metody, atrybuty) dziedziczone przez jej podklasy, ale nie posiadająca bezpośrednich wystąpień obiektów. Klasa abstrakcyjna stanowi się wyższy poziom abstrakcji przy rozpatrywaniu pewnego zestawu obiektów. Np. Pokazana wyżej klasa „Osoba” jest klasą abstrakcyjną, o ile zdefiniowane mogą być jej podklasy: „Pracownik”, „Student”, „Emeryt”. Klasa abstrakcyjna jest najczęściej używana do zdefiniowania wspólnego interfejsu dla pewnej liczby podklas. Klasa abstrakcyjna może mieć (nie musi) metody (operacje) abstrakcyjne, tj. takie, które są zdefiniowane w tej klasie, ale których implementacja znajduje się (jest oczekiwana) w jej bezpośrednich podklasach.



Z Uogólnieniem(dziedziczeniem) jest połączony Polimorfizm. Polimorfizm to jest możliwość istnienia wielu metod o tej samej nazwie w różnych podklasach (dziedziczonych z tej samej nadklasy), powiązana z możliwością wyboru konkretnej metody podczas czasu wykonania. Potomek dziedziczy wszystkie właściwości przodka, a w szczególności jego atrybuty i operacje. Najczęściej, choć nie zawsze, potomek ma także własne cechy oprócz tych , które odziedziczył po przodku. Operacja potomka mająca tę samą sygnaturę, co operacja przodka jest ważniejsza (ma pierwszeństwo). Przykład wykorzystania polimorfizmu jest pokazany na rys.10

Rys.10


Przykład skryptów wyższe pokazanych klas w środowisku JAVA jest pokazany w listingu 4.

Listing 4

/***********************************************************************


  • Module: dokument.java

  • Author: hadginov

  • Purpose: Defines the Class dokument

**********************************************************************/

import java.util.*;

public class dokument

{

public int otwierac()



{

// TODO: implement

return 0;

}

}



/***********************************************************************

**********************************************************************/

import java.util.*;

public class czasopismo extends dokument

{

}



/***********************************************************************

  • Module: ksiezka.java

  • Author: hadginov

  • Purpose: Defines the Class ksiezka

**********************************************************************/

import java.util.*;

public class ksiezka extends dokument

{

}



/***********************************************************************

  • Module: rachunek_bankowy.java

  • Author: hadginov

  • Purpose: Defines the Class rachunek_bankowy

**********************************************************************/

import java.util.*;

public class rachunek_bankowy extends dokument

{

public int otwierac()



{

// TODO: implement

return 0;

}

}



Klasa może nie mieć żadnego przodka, a może mieć jednego lub więcej. Klasę bez przodków, ale z co najmniej jednym potomkiem, nazywają się korzeniem lub klasą podstawową, a klasę bez potomków – liściem. Jeśli klasa ma jednego przodka, to mówią o dziedziczeniu pojedynczym; jeśli są ich więcej, to mówią o wielodziedziczeniu.

Agregacja. Agregacja to jest hierarchia typu „part of” . Zwykla asocjacja dwóch klas (hierachia „is a”) jest związkiem strukturalnym równorzędnych partnerów. Oznacza to, że powiązane klasy znajdują się na tym samym poziomie pojęczowym, czyli żadna nie jest ważniejsza. Może się jednak zdarzyć, że trzeba zapisać związek „calość – część”, w którym jedna z klas reprezentuje większy element („calość”) składający się z mniejszych („części”). Ten rodzaj związku nazywają się agregacją, wyrażoną zależnością „ma”: obiekt – całość ma obiekty – części.

Agregacja to jest szczególny przypadek asocjacji. Na diagramie jest wyróżniana przez dodanie do zwykłego symbolu asocjacji pustego rombu po stronie całości.



Przykład agregacji jest pokazany na rys.11

Rys.11


Przykład skryptów wyższe pokazanych klas w środowisku JAVA jest pokazany w listingu 5.

Listing 5.

/***********************************************************************


  • Module: Firma.java

  • Author: hadginov

  • Purpose: Defines the Class Firma

**********************************************************************/

import java.util.*;

public class Firma

{

}



/***********************************************************************

**********************************************************************/

import java.util.*;

public class Dzial

{

public Firma ma;



}

Taka postać agregacji ma jedynie znaczenie pojęciowe. Pusty romb wskazuje, co jest częścią, a co całością – nic więcej. Wynika z tego, że agregacja zwykła nie zmienia znaczenia „nawigacji” między całością a częściami, jak również nie wyznacza zależności między czasem życia całości a czasem życia części.

Istnieje jeszcze pewien rodzaj agregacji, tak zwaną kompozycja (composition) lub agregacja całkowitą. Związek kompozycji oznacza, że dana część może należeć tylko do jednej całości. Co więcej, część nie może istnieć bez całości, pojawia się i jest usuwana razem z całością. To znaczy, części o nieustalonej liczebności mogą powstawać po utworzeniu całości, ale potem żyją i umierają razem z nią. Takie części są usuwane przez śmiercią całości. Klasycznym przykładem związku typu „kompozycja” jest zamówienie i pozycja zamówienia: pozycja zamówienia nie występuje oddzielnie (poza zamówieniem), nie podlega przenoszeniu od jednego zamówienia do innego zamówienia i znika w momencie kasowania zamówienia.

Kompozycja jest szczególnym rodzajem asocjacji. Na diagramie wyróżniają się przez dodanie do zwykłej asocjacji zaczernionego rombu po stronie całości.



Rys.12 ilustruje zastosowanie agregacji i kompozycji.

Rys.12


Każde wystąpienie obiektu „Punkt” należy albo do obiektu „Wielobok”, albo do obiektu „Okrąg”; nie może należeć do dwóch obiektów naraz. Wystąpienie obiektu „Styl” może być dzielone przez wiele obiektów „Wielobok” i „Okrąg”. Usunięcie obiektu „Wielobok” powoduje kaskadowe usunięcie wszystkich związanych z nim obiektów „Punkt”, natomiast nie powoduje usunięcia związanego z nim obiektu „Styl”.

Przykład skryptów wyższe pokazanych klas w środowisku JAVA jest pokazany w listingu 6.

Listing 6.

/***********************************************************************



  • Module: Wielobok.java

  • Author: hadginov

  • Purpose: Defines the Class Wielobok

**********************************************************************/

import java.util.*;

public class Wielobok

{

public Punkt ma_punkty[3..*];



public Styl ma_Styl;

}

/***********************************************************************



  • Module: Punkt.java

  • Author: hadginov

  • Purpose: Defines the Class Punkt

**********************************************************************/

import java.util.*;

public class Punkt

{

}



/***********************************************************************

  • Module: Styl.java

  • Author: hadginov

  • Purpose: Defines the Class Styl

**********************************************************************/

import java.util.*;

public class Styl

{

public int kolor;



public int czyWypelniony;

}

/***********************************************************************



  • Module: Okrag.java

  • Author: hadginov

  • Purpose: Defines the Class Okrag

**********************************************************************/

import java.util.*;

public class Okrag

{

public int promien;



public Styl ma_Styl;

public Punkt ma_centr;



}

Zależność. Zależność to jest związek użycia. Zmiany dokonane w specyfikacji jednej klasy (niezależnej) mogą mieć wpływ na inną klasą (zależną), która używa pierwszą, ale niekoniecznie na odwrót. Na diagramie związek ten jest przedstawiony jako linia przerywana z grotem skierowanym na klasę niezależną. Z zależności należy korzystać wtedy, kiedy trzeba podkreślić, że obiekty klasy zależnej używają się obiekty klasy niezależnej. Najczęściej korzystają się z tego typu związków, kiedy trzeba pokazać, że jedna klasa używa drugiej jako argumentu w sygnaturze operacji. Na rys 13. jest pokazany przykład wykorzystania zależności. W tym przypadku pokazano, że metoda PlayOn() klasy „FilmClip” wykorzysta obiekt klasy „Channel” jako parametr wejściowy.


Rys. 13

Przykład skryptów wyższe pokazanych klas w środowisku JAVA jest pokazany w listingu 7.

Listing 7.

/***********************************************************************



  • Module: FilmClip.java

  • Author: hadginov

  • Purpose: Defines the Class FilmClip

**********************************************************************/

import java.util.*;

public class FilmClip

{

public String name;



public void start()

{

// TODO: implement



}

public int stop()

{

// TODO: implement



return 0;

}

public int reset()



{

// TODO: implement

return 0;

}

/** @param Parameter_1 */



public int playOn(Channel c)

{

// TODO: implement



return 0;

}
}


/***********************************************************************

**********************************************************************/

import java.util.*;

public class Channel

{

}



Przeciążanie przesłanianie i późne wiązanie

Zgodnie z polimorfizmem ta sama metoda, ale z różną implementacją, może być zdefiniowana kilka razy w hierarchii klas. Nazwy oddzielnych metod w tej hierarchii mogą być przeciążone (overloading)(перегрузка). Jeśli jest wysyłany komunikat do obiektu, to powinna być wykonana najdokładniejsza implementacja danej metody. Ta implementacja przesłania (overriding)(перекрывает) wszystkie inne możliwe implementacje. Aby zrealizować takie przesłanianie, wymagane jest późne wiązanie implementacji do wywołań metody, które powoduje odsunięcie decyzji o tym, co ma być wykonane do czasu uruchomienia.



Zgodnie z zasadą enkapsulacji, powszechne jest stosowanie tych samych nazw komunikatów w różnych kontekstach. Rozważmy komunikat o nazwie WYSWIETLY, który może być przesłany do obiektów „OSOBA” oraz „SAMOCHOD” które są podklasami klasy „DOKUMENT” (Rys.14). Ten komunikat powinien być zrozumiały przez obiekty „OSOBA” w ten sposób, że wartości atrybutów osoby otrzymującej ten komunikat mają być wyświetlone w postaci tabeli. Dla obiektów „SAMOCHOD” ten komunikat musi powodować wyświetlanie trójwymiarowego rysunku.

Rys.14


Na rys.15 są pokazane związki oraz relacje pomiędzy pojęciami:

  • klasą i obiektem;

  • metodami , komunikatami i zachowaniem obiektów;

  • typami klas, wartościami i stanami obiektów.

Rys.15



1   2   3   4   5   6   7   8   9   ...   113


©operacji.org 2017
wyślij wiadomość

    Strona główna