Typy obiektowe

Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200

Typy obiektowepozwalają na łatwe zarządzanie dużymi systemami informatycznymi dając możliwość tworzenia komponentó w sposób modułowy. Obiekty są złożonymi danymizawierającymi inne typy danych (rónież inne typy obiektowe). W ciele obiektu również mogą się znajdować procedury i funkcje. Struktura typu obiektowego skłąda się z dwóch części tak samo jak to ma miejsce w strukturze pakietów. Pierwsza część zawiera listę publicznych pół i metod dostępnych na zewnątrz obiektu. Druga część zawiera implementację tych metod. Metoda jest zwykłym podprogramem (funkcją lub procedurą) poprzedzonym słowem kluczowym MEMBER lub STATIC. Składnia MEMBER oznacza, że metoda jest związana z obiektem stworzonym na podstawie danego typu obiektowego i wywoływana poprzez nazwę tego obiektu, np.:

nazwa_obiektu.nazwametody();

Składnia STATIC oznacza, że jest to metoda statyczną z danym typem obiektowym, co oznacza, że żeby wywołać nie ma potrzeby tworzyć obiektu, żeby taką metodę wykonać.

Przykład:

nazwa_typu_obiektowego.nazwa_metody();

Przykład obiektu:

create TYPE Stack as Object(
top INTEGER,
MEMBER function full return Boolean,
MEMBER procedure push (n IN INTEGER)
);
create TYPE BODY Stack AS
MEMBER procedure push (n IN INTEGER) IS
BEGIN
IF NOT full Then
top:=top+1;
END push;
END;

Każda metoda typu MEMBER ma możliwość obsługi wbudowanego parametru o nazwie SELF określającego obiekt, z którego ta metoda została wywołana. Tak jak to ma miejsce w przypadku pakietów metody mogą gyć przeciążane, tj. metody mogą mieć taką samą nazwę rózniącą się tylko parametrami wywołania.

Do pól, jak i do metod obiektu odwołujemy się poprzez notacje kropkową:

ale:=person.age;
Person.changeName('Owak');

Obiekty mogą być magazynowane w tabelach za pomocą zapytania:

CREATE TABLE nazwa_tabeli OF typ_obiektu;

Tabele te można wykorzystywać w standardowych zapytaniach SQL. Poza tym w zapytaniach SQL można wykorzystywać funkcje VALUE zwracającą zmienną obiektową powstałą z obiektu współzależnego podanego jako parametr.

DECLARE
Person1 Person;
BEGIN
Select VALUE(pers) INTO Person1 from Person pers where pers.name='Nowak';
END;

Konstruktor obiektu

Każdy obiekt posiada konstruktor, czyli metodę (w przypadku Oracle metoda ta jest tworzona przez system), którą tworzymy instancje obiektu. Konstruktor ma taką samą nazwę jak typ obiektu. Parametrami konstruktora są zmienne o takiej samej nazwie i typie jak pola obiektu i ułożone w tej samej kolejności.

Przykład:

Person person:=Person('Jan','Kowalski','01121971');

Porównywanie obiektów

Porównywanie obiektów tego samego typu odbywa się za pomocą funkcji MAP i ORDRER. W obiekcie może być tylko jedna metoda oznaczona takimi znacznikami MAP lub ORDER. Nigdy nie mogą występować oba te znaczniki naraz. Metody te są wykorzystywane do sortowania obiektów. Metoda ze znacznikiem MAP w swoim działaniu zwraca wartość, która może charakteryzować położenie obiektu na liście względem innych obiektów. Dla przykładu dla obiektu określającego osobę metoda ta może zwrócić jego pole określające pesel osoby. W ten sposób posortujemy obiekty wg numeru pesel.

Przykład:

Create TYPE Person AS Object (
Pesel INTEGER,
MAP MEMBER FUNCTION compare RETURN INTEGER,
...
);
Create TYPE Body Person AS
MAP MEMBER FUNCTION compare RETURN INTEGER IS
BEGIN
RETURN Pesel;
END compare;
END:
...

Metoda typu ORDER jako parametr przyjmuje drugi obiekt tego samego typu i jak to ma miejsce w typowych metodach porównawczych zwraca -1 jeśli obiekt jest "mniejszy" od obiektu podawanego jako parametr, 1 jeśli jest "większy" i 0 jeśli obiekty są równe. Określenie większy i mniejszy jest zależne od programisty. Dla naszego przykładowego obiektu Person nasza metoda porównawcza typu ORDER może mieć postać:

ORDER MEMBER function compare (other Person) RETURN INTEGER IS
BEGIN
IF pesel<other.pesel THEN RETURN -1;
ELSEIF pesel>other.pesel THEN RETURN 1;
ELSE RETURN 0;
END IF:
END;

Warto tu zauważyć iż mając na względzie kwestie wydajnościowe lepiej jest używać funkcji porównującej typu MAP.

Wskażniki na obiekty

Do zaznaczenia, że dana zmienna jest wskażnikiem na obiekt lub pole obiektu jest typu wskażnikowego stosujemy słowo kluczowe REF przed nazwa zmiennej lub pola.

Przykład:

-- Zmienna typu wskażnikowego
DECLARE pobject REF MyObject;
-- Pole obiektu typu wskażnikowego
CREATE TYPE Person AS Object (
firstname VARCHAR2(20),
surname VARCHAR2(20),
...
adress REF Adres,
...
);

Ważne jest iż w przypadku wskażników nie możemy bezpośrednio odwoływać się do pól typu wskażnikowego. W pierwszym etapie musimy dokonać dereferencji wskażnika za pomocą funkcji DEREF.

Przykład:

-- wskażnik na obiekt Person
DECLARE
pobject REF Person;
-- obiekt Person
object Person;
name VARCHAR2(40);
BEGIN
...
object:=DEREF(pobject);
name:=object.name;

Funkcja REF

Funkcja mająca odwrotne działanie do funkcji DEREF jest funkcja REF zwracająca referencje obiektu. Poniższy przykład dodaje do tabeli referencji obiektów Person kolejne pozycje:

INSERT INTO person_refs Select REF(pers) FROM persons pers;

Przykład:

DECLARE
pPerson REF Person;
name VARCHAR(40);
BEGIN
Select REF(pers), pers.name INTO pPeron,name 
FROM persons pers WHERE pers.name='Kowalski';
...
END;

Rozważmy tabele, której jedna z kolumn zawiera wskażniki na obiekt zapisane w innej tabeli. Jeśli teraz skasujemy obiekt z tabeli obiektów, to w takiej sytuacji ewentualny wskażnik na ten obiekt z pierwszej tabeli nie będzie połączony z konkretnym obiektem. Do stwierdzenia, czy powyższa sytuacja ma miejsce wykorzystujemy sentencje IS DANGLING.

Przykład:

Delete from tab where col_ref IS DANGLING;


powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz