Objektorientierte Datenbanken zBeim vorigen Mal: yUmsetzung in objektorientierte Modellierung auf Implementierungsebene am Beispiel Java yKlassen und Instanzen zHeute: yFortsetzung: Generalisierung, Relationen zLernziele: yJava aus UML-Sicht verstehen yKurzeinführung in OOP am Beispiel Java xIn Übungen noch vertieft Ralf Möller, FH-Wedel
Vordefinierte Klassen zBeispiele: yjava.lang.String (Notation (“OODB.") yjava.util.Vector yjava.util.Dictionary zEntsprechende Operationen zum Erzeugen und zum Zugriff auf Elemente bzw. zum Ersetzen von Elementen definiert zVordefinierte Verknüpfungsoperationen
java.util.Vector zVector x = new Vector; zx.setElementAt(Integer(42), 0); zx.setElementAt(Integer(43), 1); zx.elementAt(0); zx.length(); zVector y = new Vector(27); zx.addElement(56);
Klassen als Attributtypen zpublic class Polyeder { java.util.Vector hülle;... } zpublic class Flaeche {... } zpublic class Kante { Punkt p1; Punkt p2;... } zpublic class Punkt {... }
Arrays am Beispiel zint a[] = new int[100]; za[0] = 1; zfor (int i = 1; i < b.length; i++) { a[i] = a[i-1] }
Arrays vs. Vektoren zBei Array muß die Maximallänge zur Erzeugungszeit (nicht Übersetzungszeit) bekannt sein zBei Vektoren (Instanzen der Klasse Vector) ist die Länge variabel zLänge kann bei beiden erfragt werden (length)
Programme zIn Java ist eine Klasse auch ein Programm, wenn eine sog. Main-Methode definiert ist zClass Test { y... ypublic static void main (String argv[]) {... } }
Generalisierung / Spezialisierung zGeneralisierungen/Spezialisierungen modellieren Beziehungen zwischen Klassen (d.h. Mengen von Instanzen) yIn Java Umsetzung durch extends-Konstrukt
Umsetzung in Java bietet nur Spezialisierung zVererbung in Java unterstützt (Einfachvererbung) yAttribute können nur von ein einer Oberklasse geerbt werden, Angabe beliebig vieler Interfaces möglich yNamenskollisionen definieren Einschränkungen zBetrachtung von Overlapping und Disjoint machen also nur für Interfaces Sinn (wird aber immer mit Klasse kombiniert, ist also in Java ohne Bedeutung) zUnterscheidung von Generalisierungsarten (mit Namen) auch in Java höchstens für Interfaces sinnvoll (aber nicht unterstützt) zAbstrakte Klassen können in Java markiert werden yKeine Instantiierbarkeit
Spezialisierung, Subtypen, Substitutionsprinzip zIn Java nur Spezialisierung, da Quellcode nicht neu übersetzt werden soll zEine Klasse, die eine andere Klasse erweitert, definiert einen Subtypen (dito für Interface) zAnnahme: Im Code steht Methodenaufruf yObjektausdruck. Methodenname ([Ausdruck {, Ausdruck}]) zZulässig nur wenn Objektausdruck ein Objekt liefert, das Instanz eines Subtyps von einer Klasse ist, die eine Methode entsprechenden Typs bereitstellt.
Spezialisierung und Vererbung zAttribute yVererbung „nach unten“ ySichtbarkeit steuerbar (public, protected, private) zOperationen yVererbung „nach unten“ yÜberschreiben einer Methode gleichen Typs in Unterklasse yAufruf der überschriebenen Methode m durch super[.m](...) yDynamisches Binden xMethode in der speziellsten Oberklasse (zuerst) anwenden yKontravarianzprinzip bei Behandlung der Methoden- Parametertypen durch den Compiler
Beispiel: zEinsatz von Objekten in Rahmenwerken (Frameworks) zSpezielles Framework: Java-Laufzeitumgebung zAnnahme: Objekt soll auf Terminal gedruckt werden zNotwendig: Objektbeschreibung als Zeichenkette zNachricht: toString() zOption: Spezielle Methoden in „eigenen“ Klassen programmieren
Interfaces und Typen zBeschreibung einer Menge von Nachrichten, die an ein Objekt gesandt werden können, das das Interface implementiert zKeine Beschreibung der Struktur der Objekte zInterface-Spezifikationen definieren Typen zLeast Commitment Prinzip yDeklaration von Variablen- und Attributtypen durch Verwendung von Interfaces yAuswahl der konkreten Struktur nach pragmatischen Gesichtspunkten zur Erzeugungszeit der Variablen- bzw. Attributwerte durch Instantiierung von Klassen
Beispiel zpublic interface... {... } zpublic class... extends... implements...,... {... }
Relationen in UML: Graphische Notation z Komposition
Beispiel: Uni-Schema
Relationen zAssoziationen, Aggregationen und Komposition modellieren auf Klassenebene Beziehungen zwischen Instanzen (der beteiligten Klassen, z.B. K1 und K2) yUmsetzung durch xEinführung neuer Attribute für K1 und K2, xVerwendung von „globalen“ Verzeichnissen (Dictionaries)
Umsetzung durch Klassenfelder (Attribute) zGeht bei funktionaler Einschränkung zVerwendung des Rollennamens als Attributname, sonst Attributname aus Relationenname generieren zGültigkeitsbereich durch Typangaben ausdrückbar
Umsetzung durch Klassenfelder mit Vectortyp zNotwendig bei nicht vorhandener funktionaler Einschränkung
Wechselseitige Referenzierung zNotwendig bei fehlender Navigierbarkeitsangabe zMultiplizitätsüberwachung durch manuell zu erstellenden Code zZugriff auf Elemente einer Relation nur über Objekte zProbleme mit nebenläufigen Kontrollflüssen und temporär nicht vollständig etablierten wechselseitigen Referenzierungen
Relationen: detailliertere Beschreibung zMultiplizität gibt an, wieviel Objekte an der Relation beteiligt sind zNavigierbarkeit beschränkt den bidirektionalen Charakter von Relationen zConstraints beschränken den Gültigkeitsbereich von Relationen zRollennamen beschreiben die Endpunkte der Relation
Umsetzung durch Verzeichnisse (Dictionaries) zAbstrakte Klassen zur Implementierung von Assoziationen zInstantiierbare Unterklasse: Hashtables
Dictionaries zAssoziation von „Elementen“ mit „Schlüsseln“ zvar Dictoriary d; zd=new Hashtable; zd.put( , „Meyer“) zd.get( ) zd.remove( )
Aggregation, Komposition zIn Java keine besonderen Sprachkonstrukte
Assoziationen: Constraints in Java zÜberwachung durch manuell zu erstellen Code
Mehrstellige Relationen zUmsetzung durch Einführung einer neuen Klasse mit entsprechenden Attributen, um auf die anderen an der Relation beteiligten Instanzen zu verweisen
Lineare Traversierung von Datenstrukturen zIterator yObjekt, das Traversierungszustand speichert zNext-Operation zur Fortschreibung der Traversierung zOperation zur Feststellung, ob Ende erreicht
Beispiel: zimport java.util.*; zvar Dictoriary d; zIterator iter = d.iterator(); zWhile (iter.hasNext()) { Object o = iterator.next();.... }
Zusammenfassung, Kernpunkte zObjektorientierte Modellierung auf Entwurfsebene umgesetzt in Implementierungsebene am Beispiel von Java zFazit: Umsetzung nicht ganz einfach (teilweise sogar relativ aufwendig)
Was kommt beim nächsten Mal? zPersistente Objekte zJava Data Objects (JDO)