Verträge und objektorientierter Entwurf

Ähnliche Dokumente
SEP 114. Design by Contract

Ersetzbarkeit und Verhalten

Konstanten, Javadoc, Patterns, Anti-Patterns

Client-Server-Beziehungen

Objektorientierte Verträge OOPM, Ralf Lämmel

Ersetzbarkeit und Verhalten

Objektorientierte Programmierung Studiengang Medieninformatik

Systematisches Testen

Warum Programme Verträge schließen sollten

Javakurs für Anfänger

Dr. Monika Meiler. Inhalt

Ausnahmebehandlung in Java

Das Vertragsmodell. Grundlagen erarbeiten für die arbeitsteilige Programmierung und für die spätere Weiterentwicklung

Javakurs für Anfänger

Unified Modelling Language

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Prinzipien Objektorientierter Programmierung

Design by Contract with JML

Objektorientierte Programmierung

1. In welchen Formen (mindestens zwei) kann man durch das Ersetzbarkeitsprinzip Wiederverwendung erzielen?

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Client-Server-Beziehungen

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Exception. 6. Exceptions. Die Klasse java.lang.exception. Fehlermeldung. Klassenname. Ort des Auftretens

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

3 Objektorientierte Konzepte in Java

Info B VL 8: Abstrakte Klassen & Interfaces

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Einführung in die Programmierung mit Java

4. Vererbung Die Klasse Object. Die Klasse Object

Autotest. Automatische Testgenerierung mit Design by Contract. von Simon Greiner am 12. Juli 2007

Softwaretechnik. Vorlesung 06: Design by Contract (Entwurf gemäß Vertrag) Peter Thiemann SS Universität Freiburg, Germany

12 Abstrakte Klassen, finale Klassen und Interfaces

Listing 1: Cowboy. Listing 2: Woody

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Qualitätssicherung in der Softwareentwicklung

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

3. Exceptions. Hintergrund: Programmieren auf der Basis von Verträgen. Kundenklasse. Lieferantenklasse

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

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

Algorithmen und Datenstrukturen

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Einführung in C# Teil 3. Matthias Nübling

Refactoring Transformationen. Martin Freund Januar 2003 Seminar Refactoring in extreme Programming AG Kastens Universität Paderborn

Programmieren 2 C++ Überblick

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Kapitel 6. Vererbung

Vererbung. Oberklassen und Unterklassen

Info B VL 14: Java Collections/Reflections

Objektorientierte Programmierung OOP

5.5.8 Öffentliche und private Eigenschaften

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

3. Dokumentieren und Testen Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Javakurs zu Informatik I. Henning Heitkötter

Aufgabenblatt: OOP - Seite 1. (2.) Geometrie: Erstellen Sie eine Klasse CPyramid, die sich von der Klasse Square ableitet:

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

3 Objektorientierte Konzepte in Java

6. Globalübung (zu Übungsblatt 8)

Programmieren in Java

Faustregeln zu Zusicherungen

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

! 1. Erste Schritte! 2. Einfache Datentypen! 3. Anweisungen und Kontrollstrukturen! 4. Verifikation! 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Java Einführung Vererbung und Polymorphie. Kapitel 13

Arten von Klassen-Beziehungen

Klausur Grundlagen der Programmierung

Kapitel 6. Vererbung

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

3. Konzepte der objektorientierten Programmierung

Objektorientierung (OO)

Grundlagen der Fehlerbehandlung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 06: Ausnahme- und Fehlerbehandlung in Java.

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

II.4.5 Generische Datentypen - 1 -

Programmieren I. Überblick Objektorientierung Heusch 12 Ratz 7. Institut für Angewandte Informatik

Einführung in die Informatik

1 Polymorphie (Vielgestaltigkeit)

Nathan Burgener. Design by Contract. Modul SWE

1.7 Fehler- und Ausnahmebehandlung

Datenstrukturen / Container in Java

Entwurfsmuster (Design Patterns)

Abgabe: keine Pflichtabgabe (vor 12 Uhr) Aufgabe 10.1 (P) Vererbung Gegeben seien folgende Java-Klassen:

Grundlagen der Programmierung Prof. H. Mössenböck. 16. Ausnahmen (Exception Handling)

Interface. So werden Interfaces gemacht

Algorithmen und Programmierung II

Programmierkurs C++ Abstrakte Klassen und Methoden

Javakurs für Anfänger

14 Abstrakte Klassen, finale Klassen, Interfaces

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Algorithmen und Datenstrukturen

Einführung in die Programmierung Lösungen P. Fierz / HS 2011/2012

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Transkript:

Verträge und objektorientierter Entwurf

Überblick Was dieses Video behandelt: Design by Contract (etwa: Entwurf gemäß Vertrag) als Richtlinie beim objektorientierten Entwurf Verträge Vererbung Invarianten Überprüfung von Argumenten und Verträgen IllegalArgumentException, NullPointerException Assertions

Modularität Aufteilung des Gesamtprogramm in getrennte Komponenten: Jede Komponente hat eine klar spezifizierte Funktion. Gesamtprogramm wird so zusammengesetzt, dass es korrekt ist, wenn nur alle Komponenten ihre Spezifikation erfüllen. Viele Gründe, z.b.: getrennte und parallele Entwicklung Austauschbarkeit Wiederverwendbarkeit Abstraktion von Implementierungsdetails

Design by Contract Design by Contract enthält methodologische Richtlinien zur komponentenbasierten Softwareentwicklung. Analogie zu Verträgen im Geschäftsleben: Jede Komponente bietet einen Vertrag an. Ein Vertrag beinhaltet das Versprechen einer Programmkomponente, eine bestimmte Leistung zu erbringen, wenn bestimmte Voraussetzungen erfüllt sind. Zusammensetzung von Komponenten nur nach Vertrag: Das Gesamtprogramm ist korrekt, wenn nur alle Komponenten ihre Verträge einhalten.

Vertrag einer Klasse Der Vertrag wird in der Dokumentation angegeben und enthält: eine Vertragsklausel für jede Methode Klasseninvarianten: Die Klasse garantiert, dass ihre Objekte stets eine bestimmte Eigenschaft haben.

Vertrag einer Methode Der Vertrag einer Methode besteht aus Vorbedingung, Nachbedingung und Effektbeschreibung. Sinngemäß: Wenn beim Aufruf der Methode die Vorbedingung X erfüllt ist, dann wird die Leistung Y erbracht. Die Ausführung der Methode hat den Nebeneffekt Z (z.b. I/O). Die Vorbedingung bezieht sich auf die Argumente der Methode und die Werte der Instanzvariablen vor Aufruf der Methode. Die Nachbedingung bezieht sich auf das Ergebnis der Methode und die neuen Werte der Instanzvariablen. Die Methode verspricht, die Nachbedingung herzustellen, wenn der Aufrufer die Vorbedingung sichergestellt hat.

Beispiel Interface World aus Game of Life: /** * Setzt die Lebendigkeitseigenschaft der Zelle * mit den Koordinaten (x, y). * * @param x x-koordinate der Zelle * @param y y-koordinate der Zelle * @param alive * ob die Zelle nach Ausführung lebendig sein soll oder nicht * @throws IllegalArgumentException * falls 0 <= x < getwidth() * oder 0 <= y < getheight() nicht gilt */ public void setcell(int x, int y, boolean alive);

Beispiel Interface World aus Game of Life: /** * Setzt die Lebendigkeitseigenschaft der Zelle * mit den Koordinaten (x, y). * Vorbedingung: * @param x x-koordinate der Zelle * @param y y-koordinate der 0 <= Zelle x && x < getwidth() && * @param alive 0 <= y && y < getheight() * ob die Zelle nach Ausführung lebendig sein soll oder nicht * @throws IllegalArgumentException * falls 0 <= x < getwidth() * oder 0 <= y < getheight() nicht gilt */ public void setcell(int x, int y, boolean alive);

Beispiel Interface World aus Game of Life: /** * Setzt die Lebendigkeitseigenschaft der Zelle * mit den Koordinaten (x, y). * Vorbedingung: * @param x x-koordinate der Zelle * @param y y-koordinate der 0 <= Zelle x && x < getwidth() && * @param alive 0 <= y && y < getheight() * ob die Zelle nach Ausführung lebendig sein soll oder nicht * @throws IllegalArgumentException * falls 0 <= x < getwidth() Nachbedingung: * oder 0 <= y < getheight() nicht alive gilt == iscellalive(x, y) */ public void setcell(int x, int y, boolean alive);

Beispiel Klasse java.lang.object equals hashcode

Verträge und Vererbung Eine Unterklasse ist an den Vertrag der Oberklasse gebunden. Eine überschreibende Methode muss den Vertrag der überschriebenen Methode einhalten: Vorbedingungen können höchstens abgeschwächt werden. Nachbedingungen können höchstens verstärkt werden.

Entwicklungsprinzip Entwicklungsprinzip Benutze nur die im Vertrag zugesichterten Leistungen. Stelle Vorbedingungen stets sicher. Getrennte Entwicklung von (gegenseitig abhängigen) Klassen: Spezifiziere die Schnittstellen und Verträge der Klassen. Jede Klasse kann nun nur anhand der Verträge der anderen Klassen implementiert werden.

Invarianten Oft sollen Instanzvariablen zu jedem Zeitpunkt bestimmte Eigenschaften haben. Beispiel: Instanzvariable!= null Anstatt sie in allen Vor- und Nachbedingungen aufzuführen formuliert man sie als Invariante der Klasse. Eine Invariante wird nur einmal für die Klasse formuliert, muss jedoch in allen Methoden und Konstruktoren beachtet werden. Jeder Konstruktor muss die Invariante als Nachbedingung herstellen. Jede Methode darf die Invariante als Vorbedingung annehmen. Jede Methode muss die Invariante als Nachbedingung sicherstellen.

Invarianten Beispiele: Instanzvariable!= null redundante Datenhaltung

Verträge und Vererbung Eine Unterklasse ist an den Vertrag der Oberklasse gebunden. Jede überschriebene Methode muss den Vertrag der überschriebenen Methode einhalten: Vorbedingungen können höchstens abgeschwächt werden. Nachbedingungen können höchstens verstärkt werden. In der Unterklasse müssen alle Invarianten der Oberklasse erhalten bleiben. Konstruktoren der Unterklasse müssen die Invarianten herstellen. Überschriebene Methoden müssen die Invariante erhalten.

Verträge und Entwurf Beispiel: Wir wollen folgende Klassenhierarchie um eine Klasse Square für Quadrate erweitern. Shape +double getwidth() +double getheight() Circle +double getwidth() +double getheight() Rectangle +double getwidth() +double getheight() +void scale(double, double) Sollen wir Square als Unterklasse von Rectangle modellieren?

Verträge und Entwurf Vertrag von void scale(double sx, double sy): Vorbedingung: sx und sy beide nichtnegativ. Nachbedingung: Es gilt getwidth( ) == sx * w, wobei w das Ergebnis von getwidth() vor dem Aufruf von scale ist. (und analog für die Höhe) Die Klasse Square kann diesen Vertrag nicht erfüllen. Square kann nicht als Unterklasse von Rectangle eingeordnet werden, sondern von Shape.

Überprüfung von Parametern und Verträgen

Öffentliche Methoden Java-Konvention: Jede öffentliche (public) Methode überprüft zuerst ihre Argumente und die Vorbedingung. IllegalArgumentException soll ausgelöst werden, wenn die Argumente die Vorbedingung nicht erfüllen. NullPointerException soll ausgelöst werden, wenn in den Argumenten ein null-wert auftaucht, wo keiner erlaubt ist. ähnliche Spezialfälle, z.b. IndexOutOfBoundsException N.B.: Bei privaten Methoden kann man (wenigstens theoretisch) ausschließen, dass illegale Argumente übergeben werden.

Assertions Wir haben Verträge bisher nur als Teil der informellen Dokumentation betrachtet. In einem korrekten Programm halten sich alle Programmteile an die Verträge. Um Programmierfehler frühzeitig zu erkennen, ist es günstig die Einhaltung der Verträge im Programm selbst zu überprüfen. Im fertigen Programm können diese Tests dann wieder abgeschaltet werden.

Assertions Java stellt eine Zusicherungsanweisung zur Überprüfung von Verträgen bereit: assert test : errorvalue; Verhält sich wie if (!test) { throw new AssertionError(errorValue); } Standardmäßig werden Assertions ignoriert, d.h. sie haben keinen Einfluss auf den Progammablauf oder die Geschwindigkeit. Assertion müssen erst aktiviert werden: java -ea Main (enable assertions) (In Eclipse -ea zu "VM arguments" hinzufügen).

Assertions Zusicherungen werden zur Überprüfung von Eigenschaften verwendet, die nach Vertrag garantiert gelten müssen. Im Idealfall wird der Vertrag eingehalten, die assert-instruktionen machen gar nichts. Ist der Vertrag verletzt, so führen die assert-instruktionen zum Programmabbruch und zur Meldung des Vertragsbruchs. Assertions werden nur zum Testen des Vertrags benutzt. Das Verhalten des Programms soll vom Ein- oder Ausschalten von Assertions unbeeinflusst sein.

Assertions Zusicherungen werden zur Überprüfung von Eigenschaften verwendet, die nach Vertrag garantiert gelten müssen. Nach Konvention werden die Vorbedingungen an Argumente in öffentlichen Methoden nicht mit assert geprüft. Dort soll z.b. IllegalArgumentException ausgelöst werden. Die Argumente and Vorbedingungen in privaten Methoden können jedoch mit assert überprüft werden. Invarianten und Nachbedinungen werden mit assert überprüft.

Assertions Beispiele: Interne Invarianten, Kontrollflussinvarianten Vorbedingungen in privaten Methoden Nachbedingungen Überprüfung von Invarianten: BitSet

Zusammenfassung Design by Contract Entwicklungsprinzipen: Benutze nur die im Vertrag einer Klasse zugesichterten Leistung, stelle Vorbedingungen stets sicher. Dokumentiere Klasseninvarianten. Minimiere das öffentliche Interface von Klassen. Verwende Assertions zur programmatischen Dokumentation und Überprüfung von Verträgen.