homedukeAlgorithmen & Datenstrukturen mit Java: Motivation und einführende Beispiele Prof. Dr. Uwe Schmidt FH Wedel

Motivation und einführende Beispiele

weiter

weiter

Definition eines abstrakten Datentyps

Beispiel
Abstrakter Datentyp List implementiert mit einfach verketteten Listen
weiter
abstrakt
nur die Schnittstelle der Operationen ist nach außen bekannt, nicht die innere Struktur
Schnittstelle
in Java: interface List
?
Hilfsklassen
E
für die Elemente
Invariant
für die Konsistenz-Überprüfung
Implementierung
in Java: class LinkedList
 
public abstract
  class LinkedList
  implements List {
  ...
  private static final
    class Empty
    extends LinkedList {
    ...
  }
 
  private static final
    class Node
    extends LinkedList {
      E          info;
      LinkedList next;
      ...
  }
  ...
}
Undef
zum Fehler auslösen
Iteratoren
Muster zum Iterieren über alle Elemente einer Kollektion
JDK Klassen
Iterator
Hilfsklasse zur bequemeren Implementierung von Iteratoren und mit einigen nützlichen allgemein verwendbaren Iteratoren
Erzeugung
von neuen Listen mit Konstruktor-Funktionen (smart constructors)
 
public abstract
  class LinkedList
  implements List {
  ...
 
  // empty list
  public static
    LinkedList empty() {
    ...
  }
 
  // singleton list
  public static
    LinkedList singleton(E e) {
    ...
  }
 
  // list from iterator
  public static
    LinkedList fromIterator(Iterator<e> elems) {
    ...
  }
 
  ...
}
Software-Technik
merke
Schnittstelle wird in einem Java Interface festgelegt (List)
gut
Wiederverwendung
merke
Implementierung in einer abstrakten Klasse (LinkedList)
merke
Nur diese abstrakte Klasse ist öffentlich bekannt
gut
Wartbarkeit durch Information Hiding
merke
Erzeugende Funktionen werden durch öffentliche, statische Funktionen realisiert, nie direkt durch Konstruktoren
merke
Wartbarkeit durch Information Hiding
merke
Summen-Datentypen werden durch Vererbung realisiert (Empty, Node, LinkedList)
merke
In einer industriell einsetzbaren Container-Bibliothek sollte, um Typsicherheit zu erreichen, über die Element-Datentypen abstrahiert werden und mit Generics gearbeitet werden (nicht eine feste Klasse E)
schlecht
Eine Implementierung mit Generics wird in Java sehr, sehr unübersichtlich und verschleiert das Ziel dieser Veranstaltung, das Verständnis über den inneren Aufbau und die Funktionsweise von Datenstrukturen
schlecht
Die Java-Implementierungen sind um Größenordnungen länger als vergleichbare Haskell-Implementierungen.
gut
Haskell-Implementierungen können sehr gut als Spezifikation dienen und führen zu besseren Java-Implementierungen

Letzte Änderung: 12.10.2016
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel