Objektorientierte Konzepte Objekt
Objekt
–
Einheit von Struktur und Verhalten
–
Struktur: Attribute / Verhalten: Methoden
–
Zustand eines Objekts: Attributwerte
–
Methoden: Lesen und Ändern des Zustands
–
Kommunikation mit anderen Objekten über Methoden
–
persistent vs. transient
–
Identität unabhängig von Zustand
–
Gehört zu einem Objekttyp
Objekttyp
Einführendes Beispiel
– Ist ein benutzerdefinierter
zusammengesetzter Datentyp
– Kapselt eine Datenstruktur zusammen mit den benötigten Methoden zur Manipulation
Attribut Attribut
Methode Methode
order_no order_no cust_info cust_info line_items line_items
amount amount
heckStatusheckStatus CancelCancel
ShipShip
Bestellung
Objektorientierte Konzepte Methoden
Methode
– Funktion, die auf einem Objekt aufgerufen wird
– Implementiert beliebigen Code
– Bestandteile:
Signatur (Deklaration): Name und Parameter
Rumpf: Implementierung der Funktionalität
Konstruktur & Destruktor
– Besondere Methoden zum Erzeugen und Vernichten von Objekten
Arten vom Methoden
– lesende
– ändern
– statische (Klassenmethoden)
Struktur eines Objekttyps
Methodenrümpfe Methodenrümpfe
Public Interface
Private
Implementation
Attributdeklarationen Attributdeklarationen Methodenspezifikationen Methodenspezifikationen Spezifikation
Spezifikation
Rumpf Rumpf
Objektorientierte Konzepte Kapselung
Kapselung
–
Zustand nur über öffentliche (public) Methoden abfragbar
–
Nicht öffentliche Methoden und Attribute nur objektintern zugänglich
Strikte Kapselung
–
Zugang nur über get- und set-Methoden (für ein bestimmtes Attribut)
–
automatische Generierung der Zugriffsmethoden
Objektorientierte Konzepte Objektidentität
OID
– Identifizierendes künstliches Merkmal eines Objekts
– Systemdefinierter Identifikator (Surrogat) – vor Anwender verborgen
– Ohne Semantik! (anders als Primärschlüssel)
– Unveränderlich während Lebenszeit des Objekts
– Referenztypen und Methoden zur Arbeit mit OIDs durch System angeboten
Typen von Gleichheit
– identisch (OIDs gleich)
– flach-gleich (alle Attribute gleich)
– Tiefgleich (Gleichheit gilt auch für alle referenzierten Objekte)
Kopieren: flach vs. tief
Objektorientierte Konzepte Klasse
Definition
–
Menge von Objekten mit gleichen Attributen (Merkmalen) und Methoden (Verhalten)
Zwei Sichtweisen
–
Intension: Beschreibung von Attributen und Methoden = Typ einer Klasse (bzw. Objekttyp)
–
Extension: Menge der aktuell existierenden Objekte (Instanzen) dieser Klasse
Programmiersprachen:
–
Z.B. Java / C++: Klassenbegriff rein intensional
–
In Datenbanken: Extensionen persistent gespeichert
Objektorientierte Konzepte Spezialisierung
Ziel: möglichst redundanzfreie Speicherung von Eigenschaften
Klassen in Sub-/Superklassenbeziehungen (ISA-Beziehung)
Intensional: Subklasse erbt Attribute und Methoden der Superklasse (Typvererbung)
Extensional: Untermengenbeziehung zwischen
Extensionen von Sub- und Superklasse
Objektorientierte Konzepte Spezialisierung (Forts.)
Substituierbarkeit: Objekt überall dort einsetzbar wo auch Superklasse erlaubt ist
Mehrfachspezialisierung:
–
mehrere Superklassen
–
Erfordert Konfliktauflösung beim Erben gleichnamiger Attribute oder Methoden
Polymorphismus (Überladen) / spätes Binden (late binding)
–
Bei Aufruf einer Methode wird die Implementierung
ausgewählt in Abhängigkeit vom aufgerufenen Objekttyp
Objektorientierung in Datenbanken
Objektorientierte Datenbanksysteme
– 1985 – 1995
– SQL-ähnliche Anfragesprache (OQL; Object Query Language)
– Vertreter: O2, POET, ObjectStore, Versant, Objectivity, Ontos, Gemstone
Relationale DBMS behielten Überlegenheit
– Anfrageoptimierung
– Transaktionsverwaltung
– Zugriffskontrolle
– SQL:1999: Standard mit vielen objektorientierten Erweiterungen
Objektrelationale Mapping-Tools
– Brückenschlag zwischen OO Programmiersprachen und RDBMS
– Vertreter: EJB, JDO, OJB, Hibernate
Objektrelationale Konzepte im SQL-Standard
Typkonstruktoren
– geschachtelte Anwendung: beliebig komplexe Datentypen
Benutzerdefinierte Datentypen
– Distinct-Typen: Kopien eines Basisdatentyps unter eigenem Namen
– Strukturierte Typen: Attribute und Methoden, Subtyp-Beziehung möglich
Benutzerdefinierte Casts (Typumwandlungen)
Benutzerdefinierte Ordnungen
Typisierte Tabellen
– Basieren auf strukturiertem Typ
– Tabellenhierarchien (Subtabelle steht in Untermengenbeziehung zur Supertabelle)
Typisierte Sichten
– Basieren auf strukturiertem Typ (liefern typisierte Tabelle)
– Sichtenhierarchien
Objektrelationale Konzepte in Oracle (Überblick)
Definition von Objekttypen (CREATE TYPE)
Objekttypen und Referenzen (REF)
Methoden
Collections (VARRAY & Nested Table)
Typvererbung (UNDER)
Polymorphismus (Overriding, Overloading)
Funktionen und Prädikate für Objekte (REF,
DEREF, TREAT, IS OF)
Spezifikation eines Objekttyps
CREATE TYPE type_name AS OBJECT [(attribute1 datatype,
attribute2 datatype, . . .]
[MEMBER procedure1 | function1 spec, procedure2 | function2 spec, . . .)]
CREATE TYPE type_name AS OBJECT [(attribute1 datatype,
attribute2 datatype, . . .]
[MEMBER procedure1 | function1 spec, procedure2 | function2 spec, . . .)]
Syntax
Syntax
Rumpf eines Objekttyps
Syntax Syntax
CREATE TYPE BODY type_name AS
[MEMBER procedure1 | function1 body, procedure2 | function2 body, . . .]
CREATE TYPE BODY type_name AS
[MEMBER procedure1 | function1 body, procedure2 | function2 body, . . .]
Spezifikation eines Objekttyps (Beispiel)
CREATE OR REPLACE TYPE katalogeintrag AS OBJECT(
bestellnr NUMBER,
preis VARCHAR2(10), verlag VARCHAR2(30),
CONSTRUCTOR FUNCTION katalogeintrag (vbestellnr IN NUMBER, vpreis IN VARCHAR2)
MEMBER PROCEDURE neuerpreis (neupreis varchar2), MEMBER FUNCTION print RETURN VARCHAR2
) NOT FINAL;
Rumpf eines Objekttyps
Konstruktormethode (Beispiel)
CREATE OR REPLACE TYPE BODY katalogeintrag AS
-- Definition des benutzerdefinierten Konstruktors CONSTRUCTOR FUNCTION katalogeintrag
(vbestellnr IN NUMBER, vpreis IN VARCHAR2) RETURN SELF AS RESULT IS
BEGIN
SELF.bestellnr:=vbestellnr;
SELF.preis:=vpreis;
SELF.verlag:=‘Spektrum Akademischer Verlag‘;
RETURN;
Rumpf eines Objekttyps
Definition der Methoden (Forts.)
-- Definition der Memberprozedur neuerPreis
MEMBER PROCECURE neuerPreis (neupreis VARCHAR2) IS BEGIN
SELF.preis:=neupreis;
END;
-- Definition der Memberfunktion print
MEMBER FUNCTION print (neupreis VARCHAR2) IS BEGIN
RETURN ‘Bestellnummer: ‘|| bestellnr || ‘; Preis: ‘
|| preis || ‘; Verlag‘ || verlag ; END;
Definition eines Subtyps
-- Definition eines Subtyps Buch von Katalogeintrag CREATE OR REPLACE TYPE buch UNDER katalogeintrtag (
isbn VARCHAR2(13), titel VARCHAR2(300), autor VARCHAR2(30),
OVERRIDING MEMBER FUNCTION print RETURN VARCHAR2 );
weitere Details zur Typvererbung später im Skript
Aufruf von Objektmethoden
SET SERVEROUTPUT ON;
DECLARE
k1 katalogeintrag;
k2 katalogeintrag;
BEGIN
-- Aufruf des Standardkonstruktors
k1:=katalogeintrag(135782,’48,95 €.‘,‘Hanser-Verlag‘);
-- Ausgabe von k1 mittels Memberfunktion PRINT dbms_output.put_line(k1.print);
-- Aufruf des benutzerdef. Konstruktors von katalogeintrag k2:=katalogeintrag(879564,’31,70 €‘);
-- Ausgabe von k2 mittels Memberfunktion print dbms_output.put_line(k2.print);
-- Test der Memberprozedur neuerpreis k1.neuerpreis(’47,25 €‘);
Verwendung von Objekten Objekttabellen
CREATE TABLE katalog OF katalogeintrag (
CONSTRAINT katalog_pk PRIMARY KEY(bestellnr) );
-- Einfügen eines DS mittels benutzerdef. Konstruktor von -- Katalogeintrag
INSERT INTO katalog values (katalogeintrag(879564,’31,70 €‘));
-- Einfügen eines DS mittels Standardkonstruktor von buch
INSERT INTO katalog values (buch(453721, ’52,90 €‘, ‘Spektrum Akademischer Verlag ‘, ‘3-8274-065-1‘, ‘Lehrbuch der
Softwaretechnik‘, ‘Helmut Balzert‘));
-- Ausgabe der DS des Supertyps SELECT * from katalog;
Objekttypen und Referenzen
REF (Reference)
–
logischer „Pointer" zu einem Row-Objekt (Datensatz)
–
Eingebauter (built-in) Datentyp
–
Genutzt für Assoziationen zwischen Objekten (zusammen mit REF-Collections) – keine Foreign Keys nötig!
–
Erlaubt einfache Navigation durch Objekte (Punkt-Notation zum Verfolgen der Pointer) – keine Joins nötig!
–
Prüfen oder Ändern des referenzierten Objekts möglich
–
Lesen einer Kopie eines referenzierten Objekts
–
Ändern des REF-Wertes (Verweis auf anderes Objekt oder Null-Setzen)
–
„dangling reference“ feststellbar (SCOPE-Klausel kontrolliert
REF (Referenztypkonstruktor) Beispiele
CREATE TYPE person AS OBJECT ( name VARCHAR2(30),
manager REF person );
Zugriff auf ein Objekt X des Typs PERSON
x.manager.name;
Zugriff auf eine Referenz
DECLARE OrderRef REF TO purchase_order;
SELECT REF(po) INTO OrderRef
Scoped REF*
Bei Definition eines REF-Typs Beschränkung der referenzierten Tabelle möglich (scoped REF)
Vorteile:
–
Effizienterer Zugriff
–
Weniger Speicherverbrauch
Beispiel:
CREATE TABLE people ( id NUMBER(4), name_obj name_objtyp,
address_ref REF address_objtyp SCOPE is address_objtab,
Methoden
Member-Methoden zum Zugriff auf Objektinstanzen
SELF: Objektinstanz der aufgerufenen
Methode („SELF“ kann weggelassen werden)
Methoden zum Vergleich von Objekten
–
Basisdatentypen: Ordnung vordefiniert
–
Benutzerdefinierte Typen: Basis zum Vergleichen und Ordnen von Objekten muss definiert werden
2 spezielle Typen von Methoden: MAP und ORDER
MAP Methode Beispiel
Abbildung (mapping) von Objekt-Instanzen auf
Basisdatentypen, Ordnen durch Aufruf MAP-Methode
obj_1 > obj_2 obj1.map() > obj2.map()
CREATE TYPE Rectangle_typ AS OBJECT(
len NUMBER,
wid NUMBER,
MAP MEMBER FUNCTION area RETURN NUMBER, ...
);
CREATE TYPE BODY Rectangle_typ AS
MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN
Varray
Geordnete Menge von Datenelementen des gleichen Datentyps mit variabler Anzahl (v)
Index eines Elements = Positions-Nr. im Array
Beispiel:
CREATE TYPE prices AS VARRAY(10) OF NUMBER(12,2)
Verwendung eines Varray:
–
Spaltentyp einer Tabelle (damit keine 1NF mehr)
–
Attribut eines Objekttyps
Nested Table
Ungeordnete Menge von Datenelementen des gleichen Typs
Hat nur eine Spalte (Basistyp oder benutzerdefiniert)
Kann auch als Multi-Column-Table betrachtet werden, wenn Elementtyp OBJECT TYPE ist.
Beispiel
-- Definition des Tabellentyps artikel_table_type für NT CREATE TYPE artikel_table_type AS TABLE OF katalogeintrag;
-- Definition einer Tabelle Publikationen mit NT-Spalte CREATE TABLE publikationen (
jahrgang NUMBER PRIMARY KEY,
Multilevel-Collection-Types
Schachtelung von Collection Types in mehreren Ebenen
Beliebig komplexe Typen möglich
Mehrfach geschachtelte Collection Types:
–
Nested Table of Nested Table Type
–
Nested Table of Varray Type
–
Varray of Nested Table Type
–
Varray of Varray Type
–
Nested Table oder Varray of a User-Defined Type mit Attribut
Storage-Tables für Nested Tables*
Storage-Table (STORE-Klausel) zum Speichern der Zeilen einer Nested Table
Bei Mehrfachschachtelung von Nested Tables
–
STORE-Klausel auf jeder Ebene
– Bezugnahme auf innere Tabelle möglich (z.B. artikel_tab) weil Attribut vorhanden (anderenfalls: COLUMN VALUE-Klausel)
Weitere physikalische Attribute (Speicherungsoptionen) möglich
Einfügen von Datensätzen bei Nested-Table-Objekten
-- Einfügen von DS in die Tabelle mit Werten für die NT- Spalte
INSERT INTO publikationen VALUES (2006, artikel_table_type (buch(453721,’52,90 €‘, ‘Spektrum Akademischer Verlag ‘, ‘3- 8274-065-1‘, ‘Lehrbuch der Softwaretechnik‘, ‘Helmut
Balzert‘)));
-- Einfügen eines DS in die Tabelle ohne NT-Daten INSERT INTO publikationen VALUES (2007,
artikel_table_type ());
Einfügen von Datensätzen bei Nested-Table-Objekten (Forts.)
-- Hinzufügen von Datensätzen zur Nested Table INSERT INTO TABLE (SELECT p.katalogartikel
FROM publikationen p WHERE p.jahrgang=2007)
VALUES (buch(163241, ’84,80 €‘, ‘Spektrum Akademischer Verlag ‘,
‘3-8274-0285-9‘, ‘Lehrbuch der Objektmodellierung‘,‘Heide Balzert‘));
INSERT INTO TABLE (SELECT p.katalogartikel FROM publikationen p
WHERE p.jahrgang=2007)
VALUES (buch(870021, ’49,60 €‘, ‘Spektrum Akademischer Verlag ‘,
‘3-8274-1449-0‘, ‘Objektorientierte Programmiersprachen‘,‘Klaus Zeppenfeld‘));
Entschachteln von Collection Queries (Beispiel)
SELECT e.empname, e.projects FROM employees e;
EMPNAME PROJECTS --- ---
'Bob' PROJECTS_LIST_NT(14, 23, 144) 'Daphne' PROJECTS_LIST_NT(14, 35)
Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten
Entschachteln von Collections bei Queries (Unnest):
– Umwandeln in Zeilen (Rows)
– TABLE Expression – erlaubt die Verwendung einer Collection in FROM-Klausel
– Entspricht einem Join zwischen Nested Table und der Zeile, die diese enthält
Anfragen auf Collections
SELECT e.empname, p.*
FROM employees e, TABLE(e.projects) p;
EMPNAME PROJECTS --- --- 'Bob' 14
'Bob' 23 'Bob' 144 'Daphne' 14 'Daphne' 35
Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten
Anfragen auf Collections (Forts.)
SELECT *
FROM employee e, TABLE(e.projects);
PROJECTS --- 14
23 144 14
Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten (Variante ohne Angestelltennamen)
DML-Befehle auf Collections (Weitere Beispiele)
INSERT INTO TABLE(SELECT e.projects FROM employees e WHERE e.eno = 100) VALUES (1, 'Project Neptune');
UPDATE TABLE(SELECT e.projects FROM employees e
WHERE e.eno = 100) p
SET VALUE(p) = project_typ(1, 'Project Pluto') WHERE p.pno = 1;
DELETE FROM TABLE(SELECT e.projects FROM employee e
Typvererbung (Type Inheritcance)
Spezialisierung eines Subtyps:
– Hinzufügen neuer Attribute (keine Veränderung geerbter Attribute)
– Hinzufügen neuer Methoden, die im Supertyp nicht vorhanden sind
– Ändern der Implementierung einer geerbten Methode
Beispiel
Object Type: Shape
Methode: calculate_area() 2 Subtypen:
Rectangle_Shape Circular_Shape
unterschiedl. Implementierungen
FINAL vs. NOT FINAL Typen und Methoden
CREATE TYPE Person_typ AS OBJECT ( ssn NUMBER,
name VARCHAR2(30),
address VARCHAR2(100)) NOT FINAL;
ALTER TYPE Person_typ FINAL;
CREATE TYPE T AS OBJECT (..., MEMBER PROCEDURE Print(),
NOT FINAL: erlaube Subtypen
Änderung der FINAL-Eigenschaft über ALTER TYPE
FINAL / NOT FINAL auch auf Methoden anwendbar
Definition von Typhierarchien
CREATE TYPE Student_typ UNDER Person_typ ( deptid NUMBER,
major VARCHAR2(30)) NOT FINAL;
CREATE TYPE Employee_typ UNDER Person_typ ( empid NUMBER,
mgr VARCHAR2(30));
CREATE TYPE PartTimeStudent_typ UNDER Student_typ
Subtypen mittels CREATE TYPE und UNDER-Klausel
Beispiele:
NOT INSTANTIABLE Typen und Methoden
CREATE TYPE Address_typ AS OBJECT(...) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE USAddress_typ UNDER Address_typ(...);
CREATE TYPE IntlAddress_typ UNDER Address_typ(...);
CREATE TYPE T AS OBJECT ( x NUMBER,
NOT INSTANTIABLE MEMBER FUNCTION func1() RETURN NUMBER
NOT INSTANTIABLE: Keine Instanzen dieses Typs möglich (auch keine Konstruktor-Methode)
Auch anwendbar auf Methoden ohne Implementierung (Platzhalter)
→ zugehöriger Typ darf dann auch noch instanziierbar sein
Beispiele:
Überladen von Methoden (Overloading)
CREATE TYPE MyType_typ AS OBJECT (...,
MEMBER PROCEDURE foo(x NUMBER, ...) NOT FINAL;
CREATE TYPE MySubType_typ UNDER MyType_typ (..., MEMBER PROCEDURE foo(x DATE),
Wenn Vielzahl von Varianten der Ausführung einer Methode
Mehrere Methoden mit gleichem Namen in einem Typ Unterscheidung anhand der Signatur
Signatur: Methodenname, Anzahl, Typen und Reihenfolge der Parameter
Beispiel: unterschiedliche
draw()-Methoden (z.B. Hinzufügen eines Text-Labels erfordert zusätzlichen Parameter)
Überschreiben von Methoden (Overriding)
CREATE TYPE MyType_typ AS OBJECT (..., MEMBER PROCEDURE Print(),
FINAL MEMBER FUNCTION foo(x NUMBER)...
) NOT FINAL;
Redefinition einer geerbten Methode im Subtyp, um dessen Spezifik zu berücksichtigen
Beispiel: Methode calculate_area() (spezielle Formel bei kreisförmigen Formen gegenüber Rechtecken)
Überschreibende Methode wird ausgeführt bei Zugriff auf Instanz des Subtyps
Beim Overriding bleibt Signatur erhalten (anders als bei Overloading!)
Substituierbarkeit (Substitutability)
Typen sind substituierbar
– Supertyp substituierbar durch einen seiner Subtypen
– Subtyp-Instanz ist zugleich auch Instanz des Supertyps
Beispiele:
– Lesen von Personen (liefert auch Instanzen der Subtypen Student, Employee)
– Einschränkungen beim Arbeiten in Typhierarchien (z.B. „nur Personen, die keine Studenten sind..“)
Substituierbarkeit anwendbar bei:
– Attributen
– Spalten
– Zeilen (Rows) bei Object Tables oder Views
– REF zu einem Objekttyp
– Collection-Typen
Substituierbarkeit kann ausgeschaltet werden
Beispiel:
Beschränkung der Substituierbarkeit
Beschränkung der Subtypen, die in Spalte/Attribut erlaubt sind, möglich mittels IS OF type - Constraint
Beispiel:
Erzeuge eine Tabelle vom Typ Book_Type, wobei die Autoren der Bücher ausschließlich Studenten sein dürfen
CREATE TABLE Student_books OF Book_typ
COLUMN author IS OF (ONLY Student_typ);
Funktionen und Prädikate für den Umgang mit Objekten
VALUE:
In: Tabellen-Alias für Object Table oder Object View
Out: Objektinstanzen, die in Object Table oder View als Rows enthalten sind
Beispiele:
SELECT VALUE(p) FROM person_table p WHERE p.name = "John Smith";
UPDATE TABLE (SELECT e.projects FROM employees e
WHERE e.eno = 100) p
SET VALUE(p) = project_typ(1, 'Project Pluto') WHERE p.pno = 1;
Funktionen und Prädikate für den Umgang mit Objekten (2)
REF:
In: Tabellen-Alias für Object Table oder Object View Out: Referenz zu einer Instanz
Beispiel:
SELECT REF(p)
FROM Person_v p
WHERE p.id = 0001 ;
DEREF:
liefert die Objekt-Instanz, auf die eine REF verweist
Beispiel:
Funktionen und Prädikate für den Umgang mit Objekten (3)
TREAT:
– zur Typanpassung (meist: Subtyp statt Supertyp)
– z.B. Behandlung einer Person als Student
Zwei Anwendungen
– Bei Zuweisungen an Variablen spezialisierter Typen (Supertyp-Wert → Subtyp)
– Zugriff auf Attribute oder Methoden eines Subtyps des deklarierten Typs von Zeile oder Spalte
Beispiel:
SELECT name, TREAT(VALUE(p) AS Student_typ).major major FROM persons p;NAME MAJOR ---- ---
IS OF type:
– Prädikat zum Test, ob Objekt-Instanz zum jeweiligen Subtyp gehört
Beispiele:
SELECT VALUE(p) FROM persons p
WHERE VALUE(p) IS OF (Student_typ);
VALUE(p) ---
Student_typ('Joe', 3456, 12, 10000)
PartTimeStudent_typ('Tim', 5678, 13, 1000, 20)
SELECT b.title title, b.author author FROM books b WHERE b.author IS OF (ONLY Student_typ);