Objektorientierte Datenbanken zBeim vorigen Mal: yUmsetzung in objektorientierte Modellierung auf...

Post on 06-Apr-2016

214 views 1 download

Transcript of Objektorientierte Datenbanken zBeim vorigen Mal: yUmsetzung in objektorientierte Modellierung auf...

Objektorientierte Datenbanken

Beim vorigen Mal: Umsetzung in objektorientierte Modellierung auf

Implementierungsebene am Beispiel Java Klassen und Instanzen

Heute: Fortsetzung: Generalisierung, Relationen

Lernziele: Java aus UML-Sicht verstehen Kurzeinführung in OOP am Beispiel Java

In Übungen noch vertieft

Ralf Möller, FH-Wedel

Vordefinierte Klassen

Beispiele: java.lang.String (Notation (“OODB.") java.util.Vector java.util.Dictionary

Entsprechende Operationen zum Erzeugen und zum Zugriff auf Elemente bzw. zum Ersetzen von Elementen definiert

Vordefinierte Verknüpfungsoperationen

java.util.Vector

Vector x = new Vector;x.setElementAt(Integer(42), 0);x.setElementAt(Integer(43), 1);x.elementAt(0);x.length();Vector y = new Vector(27);x.addElement(56);

Klassen als Attributtypen public class Polyeder {

java.util.Vector hülle; ... }

public class Flaeche { ... } public class Kante {

Punkt p1; Punkt p2; ... }

public class Punkt { ... }

+Gewicht() : float+Volumen() : float

+skalieren()+verschieben()

+rotieren()

+PolyID : int+...

Polyeder

+Umfang() : float+Volumen() : float

+FlächenID : int+...

Flächen

+Länge() : float

+KantenID : int+...

Kanten

+rotieren()+verschieben()

+skalieren()

+X : float+Y : float+Z : float

Punkte

1 1..* * * * *

Hülle Begrenzung StartEnde

4..* 2 3..* 3..* 21

Arrays am Beispiel

int a[] = new int[100];a[0] = 1;for (int i = 1; i < b.length; i++) {

a[i] = a[i-1]}

Arrays vs. Vektoren

Bei Array muß die Maximallänge zur Erzeugungszeit (nicht Übersetzungszeit) bekannt sein

Bei Vektoren (Instanzen der Klasse Vector) ist die Länge variabel

Länge kann bei beiden erfragt werden (length)

Programme

In Java ist eine Klasse auch ein Programm, wenn eine sog. Main-Methode definiert ist

Class Test { ... public static void main (String argv[]) {

...}

}

Generalisierung / Spezialisierung

Generalisierungen/Spezialisierungen modellieren Beziehungen zwischen Klassen (d.h. Mengen von Instanzen) In Java Umsetzung durch extends-Konstrukt

Umsetzung in Java bietet nur Spezialisierung

Vererbung in Java unterstützt (Einfachvererbung) Attribute können nur von ein einer Oberklasse geerbt

werden, Angabe beliebig vieler Interfaces möglich Namenskollisionen definieren Einschränkungen

Betrachtung von Overlapping und Disjoint machen also nur für Interfaces Sinn (wird aber immer mit Klasse kombiniert, ist also in Java ohne Bedeutung)

Unterscheidung von Generalisierungsarten (mit Namen) auch in Java höchstens für Interfaces sinnvoll (aber nicht unterstützt)

Abstrakte Klassen können in Java markiert werden Keine Instantiierbarkeit

Spezialisierung, Subtypen, Substitutionsprinzip

In Java nur Spezialisierung, da Quellcode nicht neu übersetzt werden soll

Eine Klasse, die eine andere Klasse erweitert, definiert einen Subtypen (dito für Interface)

Annahme: Im Code steht Methodenaufruf Objektausdruck . Methodenname ([Ausdruck {, Ausdruck}])

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

Attribute Vererbung „nach unten“ Sichtbarkeit steuerbar (public, protected, private)

Operationen Vererbung „nach unten“ Überschreiben einer Methode gleichen Typs in Unterklasse Aufruf der überschriebenen Methode m durch super[.m](...) Dynamisches Binden

Methode in der speziellsten Oberklasse (zuerst) anwenden Kontravarianzprinzip bei Behandlung der Methoden-

Parametertypen durch den Compiler

Beispiel:

Einsatz von Objekten in Rahmenwerken (Frameworks)

Spezielles Framework: Java-LaufzeitumgebungAnnahme: Objekt soll auf Terminal gedruckt

werdenNotwendig: Objektbeschreibung als

ZeichenketteNachricht: toString()Option: Spezielle Methoden in „eigenen“

Klassen programmieren

Interfaces und Typen

Beschreibung einer Menge von Nachrichten, die an ein Objekt gesandt werden können, das das Interface implementiert

Keine Beschreibung der Struktur der ObjekteInterface-Spezifikationen definieren TypenLeast Commitment Prinzip

Deklaration von Variablen- und Attributtypen durch Verwendung von Interfaces

Auswahl der konkreten Struktur nach pragmatischen Gesichtspunkten zur Erzeugungszeit der Variablen- bzw. Attributwerte durch Instantiierung von Klassen

Beispiel

public interface ... { ... }public class ... extends ... implements ... , ...

{ ... }

Relationen in UML: Graphische Notation

Komposition

+Notenschnitt() : float+SummeWochenstunden() : short

+MatrNr : int+Name : String+Semester : int

Studenten

+AnzHörer() : int+DurchfallQuote() : float

+VorlNr : int+Titel : String+SWS : int

Vorlesungen

+Hörer

1..*

*

+verschieben()

+Note : Decimal+Datum : Date

Prüfungen

+Prüfling1

*

+Prüfungsstoff1*

+Notenschnitt() : float+Gehalt() : short

+Lehrstundenzahl() : short

+Rang : StringProfessoren

* +Prüfer1

*

+Dozent

1

+Gehalt() : short+Fachgebiet : String

Assistenten

*

+Boss

1

+Gehalt() : short

+PersNr : int+Name : String

Angestellte

+Nachfolger *

*hören

voraussetzen

gelesenVon

arbeitenFür

Beispiel: Uni-Schema

Relationen

Assoziationen, Aggregationen und Komposition modellieren auf Klassenebene Beziehungen zwischen Instanzen (der beteiligten Klassen, z.B. K1 und K2) Umsetzung durch

Einführung neuer Attribute für K1 und K2, Verwendung von „globalen“ Verzeichnissen (Dictionaries)

Umsetzung durch Klassenfelder (Attribute)

Geht bei funktionaler EinschränkungVerwendung des Rollennamens als

Attributname, sonst Attributname aus Relationenname generieren

Gültigkeitsbereich durch Typangaben ausdrückbar

Umsetzung durch Klassenfelder mit Vectortyp

Notwendig bei nicht vorhandener funktionaler Einschränkung

Wechselseitige Referenzierung

Notwendig bei fehlender Navigierbarkeitsangabe

Multiplizitätsüberwachung durch manuell zu erstellenden Code

Zugriff auf Elemente einer Relation nur über Objekte

Probleme mit nebenläufigen Kontrollflüssen und temporär nicht vollständig etablierten wechselseitigen Referenzierungen

Relationen: detailliertere Beschreibung

Multiplizität gibt an, wieviel Objekte an der Relation beteiligt sind

Navigierbarkeit beschränkt den bidirektionalen Charakter von Relationen

Constraints beschränken den Gültigkeitsbereich von Relationen

Rollennamen beschreiben die Endpunkte der Relation

Umsetzung durch Verzeichnisse (Dictionaries)

Abstrakte Klassen zur Implementierung von Assoziationen

Instantiierbare Unterklasse: Hashtables

Dictionaries

Assoziation von „Elementen“ mit „Schlüsseln“var Dictoriary d;d=new Hashtable;d.put(534958345, „Meyer“)d.get(534958345) d.remove(534958345)

Aggregation, Komposition

In Java keine besonderen Sprachkonstrukte

+Gewicht() : float+Volumen() : float

+skalieren()+verschieben()

+rotieren()

+PolyID : int+...

Polyeder

+Umfang() : float+Volumen() : float

+FlächenID : int+...

Flächen

+Länge() : float

+KantenID : int+...

Kanten

+rotieren()+verschieben()

+skalieren()

+X : float+Y : float+Z : float

Punkte

1 1..* * * * *

Hülle Begrenzung StartEnde

4..* 2 3..* 3..* 21

Assoziationen: Constraints in Java

Überwachung durch manuell zu erstellen Code

Mehrstellige Relationen

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

Iterator Objekt, das Traversierungszustand speichert

Next-Operation zur Fortschreibung der Traversierung

Operation zur Feststellung, ob Ende erreicht

Beispiel:

import java.util.*;var Dictoriary d;Iterator iter = d.iterator();While (iter.hasNext()) {

Object o = iterator.next(); ....}

Zusammenfassung, Kernpunkte

Objektorientierte Modellierung auf Entwurfsebene umgesetzt in Implementierungsebene am Beispiel von Java

Fazit: Umsetzung nicht ganz einfach (teilweise sogar relativ aufwendig)

Was kommt beim nächsten Mal?

Persistente ObjekteJava Data Objects (JDO)