vom objektorientierten entwurf zur implementierung in java · aus...

35
Vom objektorientierten Entwurf zur Implementierung in Java 2. Dezember 2014

Upload: trinhthuan

Post on 05-Jun-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Vom objektorientierten Entwurf zur Implementierung in Java

2. Dezember 2014

Page 2: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 226

Ü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

Page 3: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 227

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

Page 4: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 228

Beispiel: Entwurfsmodell

Page 5: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 229

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

Page 6: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Java Standard Edition 8: Überblick

Taentzer Einführung in die Softwaretechnik 230

aus „http://docs.oracle.com/javase/8/docs/“

Page 7: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 231

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-Daten-

strukturen implementieren. Collection für Objektbehälter Map für Zuordnungen von Schlüsseln zu Werten

Schlüssel sind eindeutig.

Page 8: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Java Collections Klassen (1)

Taentzer Einführung in die Softwaretechnik 232

aus „http://wiki3.cosc.canterbury.ac.nz“

Page 9: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 233

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)).

Page 10: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 234

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

Page 11: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Welche Implementierungsklassen gibt es?

Taentzer Einführung in die Softwaretechnik 235

aus “docs.oracle.com/javase/tutorial/collections/implementations”

Page 12: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

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

Page 13: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 237

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);

Page 14: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Beispielcode für eine sortierte Menge Schnittstelle:

SortedSet Implementierung:

TreeSet Die zu sortierenden

Elemente müssen Comparableimplementieren.

Taentzer Einführung in die Softwaretechnik 238

Ausgabe:

Page 15: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Die Schnittstelle Comparable zu überschreibende Methode:

compareTo() Parameter: das zu

vergleichende Objekt o Rückgabe:

negativ: this kleiner o 0: this gleich o positiv: this größer obzgl. der definierten Ordnung

wirft Exceptions: NullPointerException ClassCastException

Taentzer Einführung in die Softwaretechnik 239

Beispiel:

Page 16: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Natürliche Ordnungen für verschiedene Klassen

Taentzer Einführung in die Softwaretechnik 240

aus “docs.oracle.com/javase/tutorial/collections/interfaces”

Page 17: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 241

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 Hilfs-

Collection). Also erst ändern, dann iterieren. Oder erst iterieren, dann ändern. Absicherung:

Set<String> c = Collection.synchronized(new HashSet<String>());

Page 18: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

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

Page 19: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Java Collections Klassen (1)

Taentzer Einführung in die Softwaretechnik 243

aus „http://wiki3.cosc.canterbury.ac.nz“

Page 20: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 244

Map-Schnittstellenklassen

MapMap 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.

SortedMapMap, deren Schlüssel zusätzlich sortiert werden.

HashMapHashCode als Schlüssel

Page 21: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 245

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);

Page 22: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Beispiel: Häufigkeit der bestellten Produkte

Taentzer Einführung in die Softwaretechnik 246

Page 23: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Auswahl der richtigen

Collection bzw. Map

Taentzer Einführung in die Softwaretechnik 247

Page 24: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 248

Ü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

Page 25: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Entwurfsmodell: Update

Taentzer Einführung in die Softwaretechnik 249

Page 26: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

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-DateienTaentzer Einführung in die Softwaretechnik 250

Page 27: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

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 Einführung in die Softwaretechnik 251

public class Singleton {private static Singleton

instance = null;private Singleton() {}

public static getInstance() {if (instance == null){

instance = new Singleton();}return instance;

}

Page 28: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Singleton-Klassen

Besser als globale Variable: wird nur erzeugt, wenn

benötigt kann spezialisiert werden kann leichter zu mehreren

Objekten geändert werden

Taentzer Einführung in die Softwaretechnik 252

Wartekartei.java:

Beispiel:

Page 29: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Realisierung von MethodenBeispiel: 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

Page 30: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Realisierung von MethodenBeispiel: Wareneingang bearbeiten

Taentzer Einführung in die Softwaretechnik 254

Wartekartei.java:

Produkt.java:

Page 31: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Ausgabe in eine Datei

Bibliothek java.io benutzen Datei zum Schreiben öffnen Output-Stream erzeugen

und in die angegebene Datei lenken IOException abfangen Strom zum Schluss schließen

z.B: FileWriter zum Schreiben von Text

z:B: java.io.BufferedWriter write() zum Schreiben eines

Buchstabens oder eines Strings

newLine() zum Schrieben eines Zeilenseparators

close() zum Schließen des Stroms

Taentzer Einführung in die Softwaretechnik 255

Page 32: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Ausgabe in eine Datei: Beispiel in Java-Code

Taentzer Einführung in die Softwaretechnik 256

Kartei.java:

Page 33: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

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

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

Taentzer Einführung in die Softwaretechnik 257

Page 34: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Beispiel:Einlesen aus einer Datei:

Taentzer Einführung in die Softwaretechnik 258

Kartei.java:

Page 35: Vom objektorientierten Entwurf zur Implementierung in Java · aus “docs.oracle.com/javase/tutorial/collections/implementations

Taentzer Einführung in die Softwaretechnik 259

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