MU 8 ZORIENTOWANI- OBIEfCK)WO JĘZYKI ZAJ»YTAŃ
!c) Należy wskazać klasy z co najmniej jednym zatopionym okrętem.
!!d) Należy wskazać bitwy, w których został uszkodzony co najmniej jeden okręt floty USA.
Typy wiersza oraz referencje do typów wiersza zapewniają w języku SQL3 spełnianie tych samych funkcji, które w języku OQL są dostępne dzięki obiektom. Poza tym można dzięki nim w wygodny sposób modyfikować „obiekty", za pomocą operatorów wstawiania i usuwania z SQL. W języku OQL natomiast takie modyfikacje są dostępne wyłącznie z poziomu języka programowania zorientowanego obiektowo, np. C++.
Niestety typy wiersza nie zapewniają hermetyzacji, która jest dostępna w językach programowania zorientow anych obiektow o. Przypomnimy tutaj to, o czym była mowa w p. 1.3.1, a mianowicie, że „hermetyzacja" klasy zapewnia, że obiekty tej klasy mogą być zmieniane tylko za pomocą stałego zestawu operatorów-, które definiuje się wraz z klasą. „Hermetyzacja" jest używana profilaktycznie przeciw błędom programowania powstającym w wyniku takiego korzystania z danych, którego projektant bazy danych nie przewidział albo nie zamierzał dopuścić.
Typy wiersza nie podlegają hermetyzacji, działania na krotkach typu wiersza wykonuje się, stosując wyrażenia dostępne w języku SQL3. Interfejsy zODL (czyli klasy) także nie zawierają pełnej hermetyzacji (kapsułkowania), ponieważ składowe obiektów są osiągalne poprzez zapytania OQL. Z drugiej strony pobieranie wartości wewnętrznych struktur}- obiektu w zasadzie jest mniej niebezpieczne niż nieoczekiwana zmiana obiektu. W języku OQL nie można aktualizować obiektów inaczej niż korzystając z metod (patrz p. 8.1.2). Te metody, najczęściej napisane w konwencjonalnym obiektowym języku programowania, np. w C++, można wykonywać ty lko na obiektach danej klasy.
W języku SQL3 istnieją inne definicje „klas", które zapewniają hermely-zację, są to abstrakcyjne typy danych (abstraci data type), w skrócie ADT. Obiektów rodzaju ADT używa się jako składowych krotek, a niejako krotek. Mają one jednak strukturę krotki, tak samo jak obiekty' w języku ODL zazwyczaj mają strukturę zawierającą składowe.
Postać definicji ADT została przedstawiona na rys. 8.16. W wierszu 1) występuje instrukcja create, w której umieszcza się nazwę typu ADT. W w ierszu 2) umieszczono listę nazw atrybutów i ich ty pów.
1) CREATE TYPE Cnazwa typu>(
2) lista atrybutów oraz ich typów
3) opcjonalna deklaracja funkcji = and < dla
deklarowanego typu
4) deklaracja funkcji (metod) typu
5) );
RYSUNEK 8.16
Definiowanie abstrakcyjnych typów danych
W wierszu 3) na rys. 8.16 występują opcjonalne deklaracje operatorów porów nania = i <. Funkcja równości ma następującą postać:
EQUALS <nazwa funkcji implementującej równość obiektowo1
Funkcja < jest deklarowana w podobny sposób, tylko zamiast słowa kluczowego equa:.S występuje słowo kluczowe LESS THAN1. Zauważmy, że pozostało cztery operatory porównania można definiować za pomocą dwóch wymienionych, a zatem nie muszą być jawnie definiowane. Na przykład oznacza ,.= lub <”, z kolei > oznacza „nic <”. Gdy zdefiniuje się operatory = i <, to wartości z ADT można porównywać w klauzulach V.'HERE tak samo jak wartości konwencjonalnych typów SQL, takie jak np. wartości całkowite lub teksty.
W wierszu 4) określono możliwość deklarowania innych funkcji (czyli metod) dla typów ADT. Poza tym w SQL3 istnieją dla typów ADT „wbudowane” funkcje standardowe, których nie trzeba ani definiować, ani deklarować. Należą tam:
1. Konstruktor - funkcja, która tworzy nowy obiekt danego typu. Wszystkie atrybuty tego obiektu mają na początku wartości NULI.. Jeśli Tjest nazwą typu ADT, to T{) oznacza konstruktor tego typu.
2. Obserwator - funkcja, która dla każdego atrybutu zwraca jego wartość. Jeśli A jest nazwą atrybutu, a X jest zmienną, której wartością jest pewien obiekt typu ADT, to A(X) oznacza wartość atrybutu A obiektu X. W tym samym celu można także stosować bardziej konwencjonalną notację XA.
3. Modyfikator - funkcja, która poszczególnym atrybutom przypisuje nowe wartości. Można z nich korzystać po lewej stronie instrukcji przypisania w sposób opisany w p. 8.6.2. Aby zapewnić hermetyzację, trzeba zablokować dostęp do tych funkcji. W $QL3 przyjęto, że do wykonania tych funkcji trzeba mieć określone prawo F.XECUTE. To prawo może być nadawane lub odbierane na takich samych zasadach jak sześć praw' w języku SQL2, co omówiono w p. 7.4.1.
W miarę ewolucji standardu SQL3 prawdopodobnie tc funkcje nic będą traktowane specjalnie, ale będą definiowane i używane tak samo jak inne funkcje typów.