Objektorientierte Implementierung

Werbung
Objektorientierte Implementierung
mit Java-Datenstrukturen
Objektorientierte Implementierung
10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework
11 Programmieren gegen Schnittstellen
Auswahl von Datenstrukturen
10) Verfeinern von Assoziationen mit
dem Java-2 Collection Framework
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann
Persistente Datenhaltung
1
Obligatorische Literatur
►
2
Softwaretechnologie
Anwendungsbeispiel für Datenstrukturen
Grobes Entwurfsmodell „Bestellungsabwicklung“ (Auszug):
JDK Tutorial für J2SE oder J2EE, www.java.sun.com
Bestellung
– kunde: String
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
1
{ordered}
*
Bestellposition
– anzahl: String
– preis: int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
für
Überladene
Namen!
*
1
Artikel
– name: String
– preis: int
Softwaretechnologie
3
Softwaretechnologie +
preis(): int
4
Zentrale Frage:
►
Wie bilde ich einseitige Assoziationen aus UML auf Java ab?
►
Antwort 1: durch Abbildung auf Arrays
Testprogramm für Anwendungsbeispiel (1)
public static void main (String[] args) {
Artikel tisch = new Artikel("Tisch",200);
Artikel stuhl = new Artikel("Stuhl",100);
Artikel schrank = new Artikel("Schrank",300);
Bestellung b1 = new
b1.neuePosition(new
b1.neuePosition(new
b1.neuePosition(new
b1.print(); ...}
Online:
Bestellung0.java
5
Softwaretechnologie
Bestellung("TUD");
Bestellposition(tisch,1));
Bestellposition(stuhl,4));
Bestellposition(schrank,2));
Bestellung fuer Kunde TUD
0. 1 x Tisch Einzelpreis: 200 Summe: 200
1. 4 x Stuhl Einzelpreis: 100 Summe: 400
2. 2 x Schrank Einzelpreis: 300 Summe: 600
Auftragssumme: 1200
Softwaretechnologie
Testprogramm für Anwendungsbeispiel (2)
Einfache Realisierung mit Arrays (1)
public static void main (String[] args) {
...
b1.sonderpreis(1,50);
b1.print();
}
class Bestellung {
6
private String kunde;
private Bestellposition[] liste;
private int anzahl = 0;
public Bestellung(String kunde) {
this.kunde = kunde;
liste = new Bestellposition[20];
}
Bestellung fuer Kunde TUD
0. 1 x Tisch Einzelpreis: 200 Summe: 200
1. 4 x Stuhl Einzelpreis: 50 Summe: 200
2. 2 x Schrank Einzelpreis: 300 Summe: 600
Auftragssumme: 1000
Softwaretechnologie
7
public void neuePosition (Bestellposition b) {
liste[anzahl] = b;
anzahl++;
// was passiert bei mehr als 20 Positionen ?
}
public void loeschePosition (int pos) {
// geht mit Arrays nicht einfach zu realisieren !
}
Softwaretechnologie
8
Einfache Realisierung mit Arrays (2)
Probleme der Realisierung mit Arrays
►
public void sonderpreis (int pos, int preis) {
liste[pos].einzelpreis(preis);
}
►
public int auftragssumme() {
int s = 0;
for(int i=0; i<anzahl; i++)
s += liste[i].positionspreis();
return s;
}
...
►
9
►
Meiste Standard-Datenstrukturen abgedeckt
■
Verwendung von Vererbung zur Strukturierung
■
Flexibel auch zur eigenen Erweiterung
Was passiert, wenn keine Ordnung benötigt wird?
Kann das Array sortiert werden?
Viele Algorithmen laufen auf sortierten Universen wesentlich schneller als
auf unsortierten (z.B. Queries in Datenbanken)
►
Wie bilde ich einseitige Assoziationen aus UML auf Java ab?
►
Antwort 3: durch Abbildung auf die Schnittstelle Collection
Bestellung
– kunde: String
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
1
Erst seit Java 1.2 (Java-2) Standard
.
■
java.util.
Antwort: Einziehen von Behälterklassen (collections) aus dem
Collection-Framework
Flachklopfen (lowering) von Sprachkonstrukten: Wir klopfen
Assoziationen zu Java-Behälterklassen flach.
Softwaretechnologie
Bestellung
– kunde: String
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
1
*
Bestellposition
– anzahl: String
– preis: int
Bestellposition
– anzahl: String
– preis: int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
für
*
für
1
Softwaretechnologie
+ preis():
*
*
1
Artikel
– name: String
– preis: int
11
1 {ordered}
<<interface>>
Collection
{ordered}
Zentrale Frage: Wie bilde ich einseitige Assoziationen aus UML auf
Java ab?
■
10
Softwaretechnologie
Basiert auf Java Generic Library (JGL) der Firma ObjectSpace
■
►
Automatisches Verschieben bei Löschen
Ersetzen von “*”-Assoziationen durch Behälterklassen
Probleme werden durch das Java-Collection-Framework gelöst,
eine objektorientierte Datenstrukturbibliothek für Java
■
Obergrenze erweiterbar
■
Flachklopfen von Assoziationen auf
Behälterklassen
Collections
►
■
■
}
Softwaretechnologie
Dynamische Arrays ?
int
Artikel
– name: String
– preis: int
+ preis(): int
12
Facetten von Behälterklassen
►
Java Collection Framework: Struktur
Behälterklassen können anhand von verschiedenen Facetten
klassifiziert werden
■
<<interface>>
Collection
Facetten sind orthogonale Dimensionen einer Klassifikation oder eines
Modells
Ordnung
Ordnung
Duplikate
Sortierung
geordnet
ungeordnet
mit Duplikaten
ohne Duplikate
sortiert
unsortiert
<<interface>>
List
Schlüssel
mit Schlüssel
ohne Schlüssel
Schlüssel
Duplikate
<<interface>>
Set
<<interface>>
Map
Sortierung
<<interface>>
SortedSet
<<interface>>
SortedMap
/home/ua1/Courses/ST1/Material/jdk-1_5_0-doc/index.html
Softwaretechnologie
13
Klassifikation der Schnittstellen der
Datenstrukturen
►
►
►
►
Schnittstelle
java.util.Collection (Auszug)
Collection (Behälter, Kollektion):
■
Ansammlung von Datenelementen
■
Hinzufügen, Entfernen, Suchen, Durchlaufen
<<interface>>
Set (Menge):
■
Reihenfolge des Einfügens, Mehrfachvorkommen spielen keine Rolle
■
SortedSet (geordnete Menge): Ordnung auf den Elementen +
Sortierung
List (Liste):
■
Mehrfachvorkommen werden separat abgelegt
■
Reihenfolge des Einfügens bleibt erhalten
Map (Abbildung, mapping, associative array):
■
Zuordnung von Schlüsselwerten auf Eintragswerte
■
Menge von Tupeln: Mehrfachvorkommen bei Schlüsseln verboten, bei
Einträgen erlaubt
■
SortedMap (geordnete Abbildung): Ordnung auf den Schlüsseln +
Sortierung danach
Softwaretechnologie
14
Softwaretechnologie
15
public interface Collection {
Collection
// Queries
// Query methods
public boolean isEmpty();
+ boolean isEmpty();
contains(Object o);
public boolean contains (Object o); ++ boolean
boolean equals(Object o);
+ int hashCode();
public boolean equals(Object o);
+ Iterator iterator();
public int size();
// Repräsentations-Transpublic int hashCode();
// formierer
public Iterator iterator();
+ Object[] toArray();
// Repräsentations-Transformierer
// Zustandsveränderer
public Object[] toArray();
+ boolean add (Object o);
+ boolean remove (Object o);
// Zustandsveränderer
+ void clear();
public boolean add (Object o);
public boolean remove (Object o);
public void clear();
…
}
16
Softwaretechnologie
java.util.List (Auszug)
java.util.Set (Auszug)
<<interface>>
Collection
public interface List extends Collection {
►
Semantik von add()?
public boolean isEmpty();
<<interface>>
List
public boolean contains (Object o);
public int size();
<<interface>>
List
public boolean add (Object o);
public boolean remove (Object o);
public void clear();
<<interface>>
Set
public Object get (int index);
public Object set (int index, Object element); // Query methods
+ Object get(int index);
public Object remove (int index);
public int indexOf (Object o);
...
}
17
Softwaretechnologie
Object - Collection - List : Beispiel
o : Object
// Zustandsveränderer
+ boolean add (Object o);
// Zustandsveränderer
+ Object remove (int index,
Object o);
+ Object set (int index, Object o);
+ int indexOf (Object o);
Die Klasse "Object" (Wiederholung)
• java.lang.Object: allgemeine Eigenschaften aller Objekte.
Keine speziellen Operationen anwendbar
■
■
"instanceOf"
o : XCol
XCol
"implements"
Collection
Jede Klasse ist Unterklasse von Object (“extends Object”).
Diese Vererbung ist implizit (d.h. man kann “extends Object”
weglassen). Dadurch werden Probleme mit Mehrfachvererbung
vermieden.
class Object {
public boolean equals (Object obj);
public int hashCode();
public String toString(); ...
add, remove, clear, isEmpty, contains, size
"instanceOf"
o : XList
XList
}
"implements"
• Jede Klasse kann die Standard-Operationen überdefinieren:
List
– equals: Objektgleichheit (Standard: Referenzgleichheit)
– hashCode: Zahlcodierung
– toString: Textdarstellung, z.B. für println()
add, remove, clear, isEmpty, contains, size,
get, set, remove, indexOf
Softwaretechnologie
18
Softwaretechnologie
19
Softwaretechnologie
20
Abstrakter und konkreter Datentyp
Abstrakter Datentyp
(Schnittstelle)
Konkreter Datentyp
(Implementierung)
►
Abstraktion:
■ Operationen
■ Verhalten der Operationen
►
►
Theorie:
■ Algebraische
Spezifikationen
►
Theorie:
■ Datenstrukturen
■ Komplexität
►
Praxis:
■ Alternativen
►
Beispiel:
■ Verkettete Liste
■ Liste durch Feld
.
Axiomensysteme
►
Praxis:
■ Abstrakte Klassen
■ Interfaces
►
Beispiel:
■ List
Implementierungen im Collection-Framework
Konkretisierung:
■ Instantiierbare Klassen
■ Ausführbare Operationen
<<interface>>
List
Implementierung (implements)
<<interface>>
Set
<<interface>>
SortedSet
ArrayList
LinkedList
21
Softwaretechnologie
Vererbung (extends)
<<interface>>
Collection
Beispiel: Implementierungsklasse
java.util.ArrayList (Auszug)
Softwaretechnologie
HashSet
<<interface>>
Map
<<interface>>
SortedMap
HashMap
TreeSet
TreeMap
22
The End
public class ArrayList implements List {
public ArrayList (int initialCapacity);
public void ensureCapacity (int minCapacity);
...
}
►
Diese Folien sind eine überarbeitete Version der Vorlesungsfolien zur
Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002.
used by permission.
<<interface>>
List
ArrayList
+ ArrayList (int initialCapacity);
+ void ensureCapacity
(int minCapacity);
Softwaretechnologie
23
Softwaretechnologie
24
Herunterladen