Generische Datenstrukturen



Ähnliche Dokumente
12) Generische Datenstrukturen

12) Generische Datenstrukturen

Schnelles Prototyping (Rapid Application Development, RAD)

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 5 Methoden

Java Einführung Collections

Einführung in die Programmierung

Tutorium 5 - Programmieren

Einführung in die Java- Programmierung

Programmieren in Java

Objektorientierte Programmierung

Prinzipien Objektorientierter Programmierung

Gebundene Typparameter

Java Einführung Abstrakte Klassen und Interfaces

Algorithmen und Datenstrukturen

1 Polymorphie (Vielgestaltigkeit)

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Java Einführung Packages

Innere Klassen in Java

U08 Entwurfsmuster (II)

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Objektorientierte Programmierung

Übungen zur Softwaretechnik

Dokumentation für das Spiel Pong

Client-Server-Beziehungen

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Typumwandlungen bei Referenztypen

5. Abstrakte Klassen

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Übung 9 - Lösungsvorschlag

Große Übung Praktische Informatik 1

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Scala kann auch faul sein

Factory Method (Virtual Constructor)

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Java: Vererbung. Teil 3: super()

Objektorientiertes JavaScript

Software Engineering Klassendiagramme Assoziationen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

C# im Vergleich zu Java

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Access und die andern (Office) Programme. Armin Hess

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Software Engineering Interaktionsdiagramme

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Vorkurs C++ Programmierung

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Programmierkurs Java

Software Engineering Klassendiagramme Einführung

Themen. Web Service - Clients. Kommunikation zw. Web Services

Probeklausur Softwareengineering SS 15

Java Generics & Collections

3 Objektorientierte Konzepte in Java

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Test-Driven Design: Ein einfaches Beispiel

Objektbasierte Entwicklung

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Einführung in die Programmierung

Robot Karol für Delphi

Der lokale und verteilte Fall

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

4. AuD Tafelübung T-C3

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Kapitel 6. Vererbung

Grundlagen von Python

Es wird das Struts <html:option> Element erläutert und anhand von kleinen Beispielen der Umgang veranschaulicht.

Einführung in die Programmierung für NF

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Unsere Webapplikation erweitern

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Studentische Lösung zum Übungsblatt Nr. 7

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Internet Explorer Version 6

1 Vom Problem zum Programm

Kapitel 6. Vererbung

Installation und Inbetriebnahme von Microsoft Visual C Express

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Assoziation und Aggregation

Erfahrungen mit Hartz IV- Empfängern

13. Tutorium zu Programmieren

ARCO Software - Anleitung zur Umstellung der MWSt

Bedienungsanleitung für den Online-Shop

Grundkonstrukte der Objektorientierung in Java, C# und C++

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Synchronisation in Java. Invisible Web

Transkript:

Generische Datenstrukturen Prof. Dr. rer. nat. habil. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden Softwaretechnologie, Prof. Uwe Aßmann 1

2 Trends in der Softwareentwicklung Rapid Application Development (RAD) Schneller viel Code schreiben Typisierung weglassen Bei den Assoziationen Beim Programmieren gegen Schnittstellen Mächtige Operationen, die schnell zu schreiben sind Safe Application Development (SAD) Guten Code schreiben Typisierung, damit der Übersetzer viele Fehler entdeckt (statische Typisierung) Mehr ntwurfswissen aus dem ntwurf in die Implementierung übertragen Typisierung der Assoziationen Aus der Definition einer Datenstruktur können Bedingungen für ihre Anwendung abgeleitet werden Zeit pike Java Java 1.5 Zuverlässigkeit Prof. U. Aßmann, Softwaretechnologie 2

lemente einer Hierarchie Formular Bestellung Lieferschein Rechnung Prof. U. Aßmann, Softwaretechnologie 3

Problem 1 ungetypter Schnittstellen: Laufzeitfehler Bei der Konstruktion von Collections werden oft Fehler programmiert, die bei der Dekonstruktion zu Laufzeitfehlern führen Kann in Java < 1.4 nicht durch den Übersetzer entdeckt werden List listofrechnung = new ArrayList(); Rechnung rechnung = new Rechnung(); listofrechnung.add(rechnung); Bestellung best = new Bestellung(); listofrechnung.add(best); Programmierfehler! for (int i = 0; i < listofrechnung.size(); i++) { ((Rechnung)rechnung) = listofrechnung.get(i); Laufzeitfehler!! Prof. U. Aßmann, Softwaretechnologie 4

Problem 2 ungetypter Schnittstellen: Unnötige Casts Bei der Dekonstruktion von Collections müssen unnötig Casts spezifiziert werden List listofrechnung = new ArrayList(); Rechnung rechnung = new Rechnung(); listofrechnung.add(rechnung); Rechnung rechnung2 = new Rechnung(); listofrechnung.add(rechnung2); Diesmal ok for (int i = 0; i < listofrechnung.size(); i++) { ((Rechnung)rechnung) = listofrechnung.get(i); Cast nötig, obwohl alles Rechnungen Prof. U. Aßmann, Softwaretechnologie 5

Abhilfe: Generische Klassen ine generische Klasse ist eine Klassenschablone, die mit einem Typparameter P versehen ist. In UML In Java Sprachregelung: Array of T P Container class Container<P> { P content[]; content P Prof. U. Aßmann, Softwaretechnologie 6

Generische Datentypen in der Collection-Hierarchie Die neue, generische Hierarchie (seit Java 1.5) Collection List Set Queue Map K,V SortedSet Blocking Queue SortedMap K,V Prof. U. Aßmann, Softwaretechnologie 7

Instanz der Generischen Hierarchie Collection List Set Queue Map K,V Collection <Formular> <<instantiates> > SortedSet Blocking Queue SortedMap K,V List <Formular> Set <Formular> Queue <Formular> Map <Nr,Formular> Darf man Rechnungen, Bestellungen und Lieferscheine in diese Collections stecken? Ja. SortedSet <Formular> Blocking Queue <Formular> SortedMap <Nr,Formular> Prof. U. Aßmann, Softwaretechnologie 8

Probleme gelöst Bei der Konstruktion von Collections werden jetzt Äpfel werden von Birnen unterschieden Casts sind nicht nötig, der Übersetzer kennt den feineren Typ List<Rechnung> listofrechnung = new ArrayList<Rechnung>(); Rechnung rechnung = new Rechnung(); listofrechnung.add(rechnung); Bestellung best = new Bestellung(); listofrechnung.add(best); Compilerfehler for (int i = 0; i < listofrechnung.size(); i++) { rechnung = listofrechnung.get(i); Kein Cast mehr nötig Prof. U. Aßmann, Softwaretechnologie 9

Generizität funktioniert auch geschachtelt // Das Archiv fasst alle Rechnungen aller bisherigen Jahrgänge zusammen List<List<Rechnung>> archiv = new ArrayList<List<Rechnung>>(); // listofrechnung fasst die Rechnungen des aktuellen Jahres zusammen List<Rechnung> listofrechnung = new ArrayList<Rechnung>(); archiv.add(listofrechnung); Rechnung rechnung = new Rechnung(); archiv.getindex(0).add(rechnung); Bestellung best = new Bestellung(); archiv.getindex(0).add(best); funktioniert for (int jahr = 0; jahr < archiv.size(); jahr++) { listofrechnung = archiv.getindex(jahr); for (int i = 0; i < listofrechnung.size(); i++) { rechnung = listofrechnung.getindex(i); Übersetzungs- Fehler Prof. U. Aßmann, Softwaretechnologie 10

Benutzung von getypten und ungetypten Schnittstellen.. ist in Java 1.5 ohne Probleme nebeneinander möglich // Das Archiv fasst alle Rechnungen aller bisherigen Jahrgänge zusammen List<List<Rechnung>> archiv = new ArrayList<List<Rechnung>>(); // listofrechnung fasst die Rechnungen des aktuellen Jahres zusammen List listofrechnung = new ArrayList(); archiv.add(listofrechnung); Rechnung rechnung = new Rechnung(); archiv.getindex(0).add(rechnung); Bestellung best = new Bestellung(); archiv.getindex(0).add(best); for (int jahr = 0; jahr < archiv.size(); jahr++) { listofrechnung = archiv.getindex(jahr); funktioniert for (int i = 0; i < listofrechnung.size(); i++) { rechnung = (Rechnung)listOfRechnung.getIndex(i); Übersetzt auch, aber Laufzeitfehler beim Cast... Prof. U. Aßmann, Softwaretechnologie 11

Typschranken generischer Parameter (type bounds) Beispiel: Comparable<> als Return-typ in der Collections-Klasse sichert zu, dass die Methode compareto() existiert class Collections { /** minimum function for a Collection. Return value is typed * with a generic type with a type bound */ public static < extends Comparable<>> min(collection<> ce) { Iterator<> iter = ce.iterator(); curmin = iter.next; if (curmin == null) return curmin; for ( element = curmin; iter.hasnext(), element = iter.next) { if (element.compareto(curmin) < 0) { curmin = element; return curmin; Prof. U. Aßmann, Softwaretechnologie 12

Generische Methoden als Funktionale Objekte in Funktionalobjekt ist ein Objekt, das eine Funktion darstellt (reifiziert). Funktionalobjekte können Berechnungen kapseln und später ausführen (laziness) s gibt eine Funktion in der Klasse des Funktionalobjektes, dass die Berechnung ausführt Generischer Name, z.b. execute() oder doit() Zur Laufzeit kann man das Funktionalobjekt mit Parametern versehen Herumreichen Und zum Schluss ausführen Prof. U. Aßmann, Softwaretechnologie 13

Generische Methoden als Funktionale Objekte Anwendung: Akkumulatoren und andere generische Listenoperationen BinOp P // A functional object that adds, once invoked interface BinOp<P> { P execute(p p1, P p2) Collection <P> Functional Accumulate B // an interface for a collection of binary operation on // collections interface Functional<Collection<P>,B extends BinOp<P>> { P compute(collection<p> p); class Accumulate<C,P> implements Functional<C,P> { P cursum; P element; B binaryoperation; public P compute(collection<p> c) { for (int i = 0; i < c.size(); i++) { element = c.getindex(i); binaryoperation.execute(cursum,p); return cursum; Prof. U. Aßmann, Softwaretechnologie 14

Unterschiede zu C++ In Java: einmalige Übersetzung des generischen Datentyps Verliert etwas ffizienz, da der Übersetzer alle Typinformation im generierten Code vergisst und nicht ausnutzt z.b. sind alle Instanzen mit unboxed objects als boxed objects realisiert C++ bietet Code-Templates (snippets, fragments) an, mit denen man mehr parameterisieren kann, z.b. Methoden In C++ können Templateparameter Variablen umbenennen: template class C <class T> { T attribute<t> Templateparameter können Variablen umbenennen Prof. U. Aßmann, Softwaretechnologie 15

nd Prof. U. Aßmann, Softwaretechnologie 16