Objektorientierte Datenbanken Ralf Mller FHWedel z Beim vorigen
Objektorientierte Datenbanken Ralf Möller, FH-Wedel z Beim vorigen Mal: y Umsetzung in objektorientierte Modellierung auf Implementierungsebene am Beispiel Java y Klassen und Instanzen z Heute: y Fortsetzung: Generalisierung, Relationen z Lernziele: y Java aus UML-Sicht verstehen y Kurzeinführung in OOP am Beispiel Java x In Übungen noch vertieft
Vordefinierte Klassen z Beispiele: yjava. lang. String (Notation (“OODB. ") yjava. util. Vector yjava. util. Dictionary z Entsprechende Operationen zum Erzeugen und zum Zugriff auf Elemente bzw. zum Ersetzen von Elementen definiert z Vordefinierte Verknüpfungsoperationen
java. util. Vector z Vector x = new Vector; z x. set. Element. At(Integer(42), 0); z x. set. Element. At(Integer(43), 1); z x. element. At(0); z x. length(); z Vector y = new Vector(27); z x. add. Element(56);
Klassen als Attributtypen z public class Polyeder { java. util. Vector hülle; . . . } z public class Flaeche {. . . } z public class Kante { Punkt p 1; Punkt p 2; . . . } z public class Punkt {. . . }
Arrays am Beispiel z int a[] = new int[100]; z a[0] = 1; z for (int i = 1; i < b. length; i++) { a[i] = a[i-1] }
Arrays vs. Vektoren z Bei Array muß die Maximallänge zur Erzeugungszeit (nicht Übersetzungszeit) bekannt sein z Bei Vektoren (Instanzen der Klasse Vector) ist die Länge variabel z Länge kann beiden erfragt werden (length)
Programme z In Java ist eine Klasse auch ein Programm, wenn eine sog. Main-Methode definiert ist z Class Test { y. . . ypublic static void main (String argv[]) {. . . } }
Generalisierung / Spezialisierung z Generalisierungen/Spezialisierungen modellieren Beziehungen zwischen Klassen (d. h. Mengen von Instanzen) y. In Java Umsetzung durch extends-Konstrukt
Umsetzung in Java bietet nur Spezialisierung z Vererbung in Java unterstützt (Einfachvererbung) y Attribute können nur von einer Oberklasse geerbt werden, Angabe beliebig vieler Interfaces möglich y Namenskollisionen definieren Einschränkungen z Betrachtung von Overlapping und Disjoint machen also nur für Interfaces Sinn (wird aber immer mit Klasse kombiniert, ist also in Java ohne Bedeutung) z Unterscheidung von Generalisierungsarten (mit Namen) auch in Java höchstens für Interfaces sinnvoll (aber nicht unterstützt) z Abstrakte Klassen können in Java markiert werden y Keine Instantiierbarkeit
Spezialisierung, Subtypen, Substitutionsprinzip z In Java nur Spezialisierung, da Quellcode nicht neu übersetzt werden soll z Eine Klasse, die eine andere Klasse erweitert, definiert einen Subtypen (dito für Interface) z Annahme: Im Code steht Methodenaufruf y Objektausdruck. Methodenname ([Ausdruck {, Ausdruck}]) z Zulässig nur wenn Objektausdruck ein Objekt liefert, das Instanz eines Subtyps von einer Klasse ist, die eine Methode entsprechenden Typs bereitstellt.
Spezialisierung und Vererbung z Attribute y Vererbung „nach unten“ y Sichtbarkeit steuerbar (public, protected, private) z Operationen y Vererbung „nach unten“ y Überschreiben einer Methode gleichen Typs in Unterklasse y Aufruf der überschriebenen Methode m durch super[. m](. . . ) y Dynamisches Binden x Methode in der speziellsten Oberklasse (zuerst) anwenden y Kontravarianzprinzip bei Behandlung der Methoden. Parametertypen durch den Compiler
Beispiel: z Einsatz von Objekten in Rahmenwerken (Frameworks) z Spezielles Framework: Java-Laufzeitumgebung z Annahme: Objekt soll auf Terminal gedruckt werden z Notwendig: Objektbeschreibung als Zeichenkette z Nachricht: to. String() z Option: Spezielle Methoden in „eigenen“ Klassen programmieren
Interfaces und Typen z Beschreibung einer Menge von Nachrichten, die an ein Objekt gesandt werden können, das Interface implementiert z Keine Beschreibung der Struktur der Objekte z Interface-Spezifikationen definieren Typen z Least Commitment Prinzip y. Deklaration von Variablen- und Attributtypen durch Verwendung von Interfaces y. Auswahl der konkreten Struktur nach pragmatischen Gesichtspunkten zur Erzeugungszeit der Variablen- bzw. Attributwerte durch Instantiierung von Klassen
Beispiel z public interface. . . {. . . } z public class. . . extends. . . implements. . . , . . . {. . . }
Relationen in UML: Graphische Notation z Komposition
Beispiel: Uni-Schema
Relationen z Assoziationen, Aggregationen und Komposition modellieren auf Klassenebene Beziehungen zwischen Instanzen (der beteiligten Klassen, z. B. K 1 und K 2) y. Umsetzung durch x. Einführung neuer Attribute für K 1 und K 2, x. Verwendung von „globalen“ Verzeichnissen (Dictionaries)
Umsetzung durch Klassenfelder (Attribute) z Geht bei funktionaler Einschränkung z Verwendung des Rollennamens als Attributname, sonst Attributname aus Relationenname generieren z Gültigkeitsbereich durch Typangaben ausdrückbar
Umsetzung durch Klassenfelder mit Vectortyp z Notwendig bei nicht vorhandener funktionaler Einschränkung
Wechselseitige Referenzierung z Notwendig bei fehlender Navigierbarkeitsangabe z Multiplizitätsüberwachung durch manuell zu erstellenden Code z Zugriff auf Elemente einer Relation nur über Objekte z Probleme mit nebenläufigen Kontrollflüssen und temporär nicht vollständig etablierten wechselseitigen Referenzierungen
Relationen: detailliertere Beschreibung z Multiplizität gibt an, wieviel Objekte an der Relation beteiligt sind z Navigierbarkeit beschränkt den bidirektionalen Charakter von Relationen z Constraints beschränken den Gültigkeitsbereich von Relationen z Rollennamen beschreiben die Endpunkte der Relation
Umsetzung durch Verzeichnisse (Dictionaries) z Abstrakte Klassen zur Implementierung von Assoziationen z Instantiierbare Unterklasse: Hashtables
Dictionaries z Assoziation von „Elementen“ mit „Schlüsseln“ z var Dictoriary d; z d=new Hashtable; z d. put(534958345, „Meyer“) z d. get(534958345) z d. remove(534958345)
Aggregation, Komposition z In Java keine besonderen Sprachkonstrukte
Assoziationen: Constraints in Java z Überwachung durch manuell zu erstellen Code
Mehrstellige Relationen z Umsetzung durch Einführung einer neuen Klasse mit entsprechenden Attributen, um auf die anderen an der Relation beteiligten Instanzen zu verweisen
Lineare Traversierung von Datenstrukturen z Iterator y. Objekt, das Traversierungszustand speichert z Next-Operation zur Fortschreibung der Traversierung z Operation zur Feststellung, ob Ende erreicht
Beispiel: z import java. util. *; z var Dictoriary d; z Iterator iter = d. iterator(); z While (iter. has. Next()) { Object o = iterator. next(); . . }
Zusammenfassung, Kernpunkte z Objektorientierte Modellierung auf Entwurfsebene umgesetzt in Implementierungsebene am Beispiel von Java z Fazit: Umsetzung nicht ganz einfach (teilweise sogar relativ aufwendig)
Was kommt beim nächsten Mal? z Persistente Objekte z Java Data Objects (JDO)
- Slides: 30