Vom objektorientierten Entwurf zur Implementierung

Werbung
Vom objektorientierten Entwurf zur
Implementierung in Java
2. Dezember 2014
Überblick
 Verwendung von Frameworks und Bibliotheken
 Was enthält die Java Standard Edition?
 Implementieren mit dem Java Collections Framework
 zum Arbeiten mit Objektmengen, –listen und Abbildungen
 Dokumentation:
 Java Standard Edition 8: http://docs.oracle.com/javase/8/docs/
 Wie wird ein Entwurfsmodell in Code übersetzt?
 Ein- und Ausgabe in Dateien
Taentzer
Einführung in die Softwaretechnik
226
Implementierungsprinzipien
 Verwendung von Klassenbibliotheken, wo möglich
 Wiederverwendung des Codes soweit möglich
 Realisierung des Entwurfs, bei Abweichungen den
Entwurf entsprechend anpassen
 auf die Testbarkeit von Methoden achten
 kleine Einheiten realisieren und testen
 weitgehend selbstdokumentierender Code
 Verwendung von javadoc zur Dokumentation von Klassen
und komplexeren Methoden
Taentzer
Einführung in die Softwaretechnik
227
Beispiel: Entwurfsmodell
Taentzer
Einführung in die Softwaretechnik
228
Java Standard Edition
Zu Java gibt es eine große Standardklassenbibliothek.
 Unter anderem enthalten:
 java.awt, java.swing: Graphiken und Bilder, graphische
Benutzeroberflächen
 java.lang: grundlegende Klassen für die Sprache Java
 java.io: Ein- und Ausgabe in Datenströme, Dateien, etc.
 java.math: mathematische Funktionen
 java.net: Implementierung von Netzwerk-Anwendungen
 java.sql: Datenquellen, insbesondere relationale Datenbanken
 java.util: nützliche Helfer, insbesondere Java Collections
Framework, Ereignismodell, Date und Time-Funktionalitäten
Taentzer
Einführung in die Softwaretechnik
229
Java Standard Edition 8: Überblick
aus „http://docs.oracle.com/javase/8/docs/“
Taentzer
Einführung in die Softwaretechnik
230
Das Java Collections Framework
 Das Java Collections Framework (JCF) bietet
Implementierungen der gängigsten Datenstrukturen.
 zu finden im Paket java.util
 Z.B. lassen sich die Assoziationen durch JCF-Datenstrukturen implementieren.
 Collection für Objektbehälter
 Map für Zuordnungen von Schlüsseln zu Werten
 Schlüssel sind eindeutig.
Taentzer
Einführung in die Softwaretechnik
231
Java Collections Klassen (1)
aus „http://wiki3.cosc.canterbury.ac.nz“
Taentzer
Einführung in die Softwaretechnik
232
Collection Schnittstellenklassen
 Collection: Ein Behälter für Objekte.
Die im folgenden aufgeführten Schnittstellen Set, SortedSet und List
sind von Collection abgeleitet.
 Set: Ein Behälter für Objekte mit Mengencharakter. Duplikate sind
nicht erlaubt.
 SortedSet: Analog zu Set mit dem Unterschied, dass die Elemente
sortiert werden.
 List: Ein Objektbehälter, in dem Objekte über Integer-Werte indiziert
werden. Duplikate sind erlaubt. Ein neues Element kann an eine
beliebige Stelle in einer List positioniert werden.
 Queue: Ein Objektbehälter, in den immer vorn oder immer hinten
eingefügt und vorn herausgenommen wird (LIFO (Stack) und FIFO
(Queue)).
Taentzer
Einführung in die Softwaretechnik
233
Die Collection-Schnittstelle
 Typ: Collection<E> - iterierbare Ansammlung von
Objekten vom Typ E
 boolean add(E e) – fügt Element e hinzu
 boolean contains(E e) – prüft, ob Element e enthalten
ist
 boolean remove(E e) – entfernt Element e
 Iterator<E> iterator() – gibt einen Iterator auf die
Collection zurück
Taentzer
Einführung in die Softwaretechnik
234
Welche Implementierungsklassen gibt es?
aus “docs.oracle.com/javase/tutorial/collections/implementations”
Taentzer
Einführung in die Softwaretechnik
235
Implementierungsstrukturen
 Array…: intern ein größenveränderliches Array
 size, get(i), set(i) in konstanter Zeit,
 alle anderen Operationen in linearer Zeit
 Hash…: intern eine Hashing und Mapping-Struktur
 Die Schlüssel (Keys) haben i.a. keine Bedeutung (ungeordnet).
 effiziente und ca. gleiche Zeit zum Auffinden von Elementen
 Linked…: Elemente intern verlinkt
 optimal für das Einfügen/Löschen von Elementen und zum
Iterieren durch alle Elemente
 Tree…: interne Speicherung durch einen Baum
 Reihenfolge der Elemente durch natürliche Ordnung oder einen
speziellen Vergleichsoperator
Taentzer
Einführung in die Softwaretechnik
236
Durch eine Collection iterieren

Java 1.4 oder älter:
Collection c = new HashSet();
c.add(“a“);
c.add(“b“);
Iterator i = c.iterator();
while(i.hasNext())
System.out.println((String)i.next());

ab Java 5:
Collection<String> c = new HashSet<String>();
c.add(“a“);
c.add(“b“);
for(String i:c)
System.out.println(i);
Taentzer
Einführung in die Softwaretechnik
237
Beispielcode für eine sortierte Menge
 Schnittstelle:
 SortedSet
 Implementierung:
 TreeSet
 Die zu sortierenden
Elemente müssen
Comparable
implementieren.
Ausgabe:
Taentzer
Einführung in die Softwaretechnik
238
Die Schnittstelle Comparable
 zu überschreibende Methode: Beispiel:
compareTo()
 Parameter: das zu
vergleichende Objekt o
 Rückgabe:
 negativ: this kleiner o
 0: this gleich o
 positiv: this größer o
bzgl. der definierten
Ordnung
 wirft Exceptions:
 NullPointerException
 ClassCastException
Taentzer
Einführung in die Softwaretechnik
239
Natürliche Ordnungen für
verschiedene Klassen
aus “docs.oracle.com/javase/tutorial/collections/interfaces”
Taentzer
Einführung in die Softwaretechnik
240
Gleichzeitiges Iterieren und Ändern von
Collections

Code-Ausschnitt:
Set<String> s = new HashSet<String>();
s.add(“a“);
s.add(“b“);
for(String i: s){
System.out.println(i);
s.add(“x“);
}



führt zu einer Concurrent Modification Exception
Deshalb: Iterieren und Änderungen separat halten (eventuell in einer HilfsCollection). Also erst ändern, dann iterieren. Oder erst iterieren, dann ändern.
Absicherung:
Set<String> c = Collection.synchronized(new HashSet<String>());
Taentzer
Einführung in die Softwaretechnik
241
Tuning der Implementierung
 ArrayList:
 initialCapacity: Anzahl der Elemente in der ArrayList, bevor sie
erweitert werden muss
 Listen von fester Länge: Arrays.asList()
 HashSet:
 initialCapacity: Anzahl der Hash-Behälter (engl. Buckets),
initial: 16 Richtwert: 2 x die erwartete Größe
 load factor: Auslastung der Behälter (wird meist nicht geändert)
Taentzer
Einführung in die Softwaretechnik
242
Java Collections Klassen (1)
aus „http://wiki3.cosc.canterbury.ac.nz“
Taentzer
Einführung in die Softwaretechnik
243
Map-Schnittstellenklassen
 Map
Map definiert eine Zuordnung von Schlüsseln zu Werten.
Jedem Schlüssel wird eindeutig ein Wert zugewiesen.
Schlüssel können somit keine Duplikate enthalten, Werte
schon.
 SortedMap
Map, deren Schlüssel zusätzlich sortiert werden.
 HashMap
HashCode als Schlüssel
Taentzer
Einführung in die Softwaretechnik
244
Map-Schnittstelle
 Map<K,V> - Zuordnung von Objekten der Klasse V zu Schlüsseln der
Klasse K
 V put(K key, V value) – Zuordnung von Wert value zu Schlüssel
key
 boolean containsKey(K key) – prüft, ob der Schlüssel key definiert
ist
 V get(K key) – gibt den Wert für Schlüssel key zurück
 Set<K> keySet() – gibt die Schlüsselmenge zurück
 Collection<V> values() – gibt die Wertansammlung zurück
Map<Integer,String> m = new HashMap<Integer,String>();
m.put(1,"c");
m.put(2,"d");
Collection<String> strings = m.values();
for (String s: strings)
System.out.println(s);
Taentzer
Einführung in die Softwaretechnik
245
Beispiel: Häufigkeit der bestellten
Produkte
Taentzer
Einführung in die Softwaretechnik
246
Auswahl der
richtigen
Collection
bzw. Map
Taentzer
Einführung in die Softwaretechnik
247
Überblick
 Verwendung von Frameworks und Bibliotheken
 Was enthält die Java Standard Edition?
 Implementieren mit dem Java Collections Framework
 zum Arbeiten mit Objektmengen, –listen und Abbildungen
 Dokumentation:
 Java Standard Edition 8: http://docs.oracle.com/javase/7/docs/
 Wie wird ein Entwurfsmodell in Code übersetzt?
 Ein- und Ausgabe in Dateien
Taentzer
Einführung in die Softwaretechnik
248
Entwurfsmodell: Update
Taentzer
Einführung in die Softwaretechnik
249
Java-Projekt: 1. Iteration
 Realisierung der Datenschicht
mit Datenhaltung in Dateien
 Datenschicht in Paket data
UML-Klassen  Java-Klassen
UML-Enumeration  Java-Enum
UML-Attribute  Java-Felder
binäre UML-Assoziationen  ein
oder zwei Java-Felder
 UML-Operation  Java-Methode
 UML-Vererbung  Java-Vererbung




 Paket test für Test-Klassen
 Ordner files für Test-Dateien
Taentzer
Einführung in die Softwaretechnik
250
Singleton-Klassen
 Es soll genau ein Objekt der
Klasse geben.
 Lösung:
 Instanz als Klassenvariable
 Privater Konstruktor
 Getter für die Instanz
 Beispiele:
 Factory: Eine Klasse, die
Objekte eines Pakets erzeugt.
Einstiegsklasse für ein Paket
 Registry: zentrale Klasse, die
Informationen vermittelt
Taentzer
public class Singleton {
private static Singleton
instance = null;
private Singleton() {}
public static getInstance() {
if (instance == null){
instance = new Singleton();
}
return instance;
}
Einführung in die Softwaretechnik
251
Singleton-Klassen
Beispiel:
 Besser als globale Variable:
 wird nur erzeugt, wenn
benötigt
 kann spezialisiert werden
 kann leichter zu mehreren
Objekten geändert werden
Taentzer
Wartekartei.java:
Einführung in die Softwaretechnik
252
Realisierung von Methoden
Beispiel: Wareneingang bearbeiten
 längere Algorithmen in
funktionale Einheiten
zerlegen
 Welche beteiligten
Objekte übernehmen
welche Einheiten?
 neue (private) Methoden
identifizieren
 Entwurfsmodell bzgl.
neuer öffentlicher
Methoden anpassen
Taentzer
Einführung in die Softwaretechnik
253
Realisierung von Methoden
Beispiel: Wareneingang bearbeiten
Produkt.java:
Wartekartei.java:
Taentzer
Einführung in die Softwaretechnik
254
Ausgabe in eine Datei
 Bibliothek java.io benutzen
 Datei zum Schreiben öffnen  z.B: FileWriter
 zum Schreiben von Text
 Output-Stream erzeugen
 z:B: java.io.BufferedWriter
und in die angegebene
 write() zum Schreiben eines
Datei lenken
 IOException abfangen
 Strom zum Schluss schließen
Taentzer
Buchstabens oder eines
Strings
 newLine() zum Schrieben
eines Zeilenseparators
 close() zum Schließen des
Stroms
Einführung in die Softwaretechnik
255
Ausgabe in eine Datei: Beispiel in
Java-Code
Kartei.java:
Taentzer
Einführung in die Softwaretechnik
256
Einlesen aus einer Datei
 Bibliotheken java.io und
java.util benutzen
 Datei zum Lesen öffnen
 Input-Stream erzeugen und
mit der Datei verknüpfen
 IOException abfangen
 Strom zum Schluss schließen
 strukturiertes Einlesen mit
StreamTokenizer oder
Scanner
 strukturiert die Eingabe in sinnvolle
Einheiten
Taentzer
 z.B. FileReader
 zum Lesen von Text
 z.B. BufferedReader
 read(), readLine(), close() –
analog zu BufferedWriter
 z.B. Scanner




hasNext() – hat noch Eingabe
nextInt() – nächster Integer
next() – nächster String
nextLine() – nächste Zeile
Einführung in die Softwaretechnik
257
Beispiel:
Einlesen aus
einer Datei:
Kartei.java:
Taentzer
Einführung in die Softwaretechnik
258
Zusammenfassung
 Java Collections Framework
 Verwendung von Standardstrukturen und –algorithmen bzgl.
Objektmengen, –listen und Abbildungen
 Sortieren entlang einer natürlichen Ordnung, implementiert durch
Comparable
 Verschiedene Implementierungen, je nach Anforderungen: mehr
Iterieren oder mehr Hinzufügen und Löschen
 Nur eine Aktion zu einer Zeit: Nicht gleichzeitig durch eine Collection
iterieren und sie ändern.
 Möglichst direkte Übersetzung des Entwurfsmodells in Code
 Ein- und Ausgabe in Dateien
 für die Eingabe Scanner benutzen
Taentzer
Einführung in die Softwaretechnik
259
Herunterladen