Objektorientierte Modellierung: Generalisierung, Relationen

Werbung
Objektorientierte Datenbanken
Ralf Möller, FH-Wedel
 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
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 { ... }
Polyeder
+PolyID : int
+...
+Gewicht() : float
+Volumen() : float
+skalieren()
+verschieben()
+rotieren()
Flächen
+FlächenID : int
Hülle
+...
1
1..*
1 4..* +Umfang() : float
+Volumen() : float
Punkte
+X : float
Kanten
+Y : float
Begrenzung
StartEnde
+KantenID : int
+Z : float
+...
2*
3..*
3..*
2*
*
*
+rotieren()
+Länge() : float
+verschieben()
+skalieren()
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 MethodenParametertypen durch den Compiler
Beispiel:
Einsatz von Objekten in Rahmenwerken
(Frameworks)
Spezielles Framework: Java-Laufzeitumgebung
Annahme: Objekt soll auf Terminal gedruckt
werden
Notwendig: Objektbeschreibung als Zeichenkette
Nachricht: 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 Objekte
Interface-Spezifikationen definieren Typen
Least 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
+Hörer
+Nachfolger
1..*
hören
*
1 +Prüfling
*
Prüfungen
+Note : Decimal
+Datum : Date
+verschieben()
Assistenten
+Fachgebiet : String
+Gehalt() : short
Vorlesungen
+VorlNr : int
+Titel : String
+SWS : int
+AnzHörer() : int
+DurchfallQuote() : float
*
1
*
1
+Boss
*
arbeitenFür
Angestellte
+PersNr : int
+Name : String
+Gehalt() : short
1
voraussetzen
*
*
*
+Prüfungsstoff
gelesenVon
Studenten
+MatrNr : int
+Name : String
+Semester : int
+Notenschnitt() : float
+SummeWochenstunden() : short
+Prüfer
Professoren
+Rang : String
+Notenschnitt() : float
+Gehalt() : short
+Lehrstundenzahl() : short
1
+Dozent
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änkung
Verwendung 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
Polyeder
+PolyID : int
+...
+Gewicht() : float
+Volumen() : float
+skalieren()
+verschieben()
+rotieren()
Flächen
+FlächenID : int
Hülle
+...
1..*
11 4..*
+Umfang() : float
+Volumen() : float
Punkte
+X : float
Kanten
+Y : float
Begrenzung
StartEnde
+KantenID : int
+Z : float
+...
2*
3..*
3..*
2*
*
*
+rotieren()
+Länge() : float
+verschieben()
+skalieren()
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 Objekte
Java Data Objects (JDO)
Herunterladen