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

Ähnliche Dokumente
Warum Programme Verträge schließen sollten

Ersetzbarkeit und Verhalten

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

Client-Server-Beziehungen

Algorithmen und Datenstrukturen

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

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

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Design by Contract with JML

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

SEP 114. Design by Contract

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Programmieren in Java

Nathan Burgener. Design by Contract. Modul SWE

Ersetzbarkeit und Verhalten

SPARK95. Ingmar Wirths. 12. Juli 2007

Programmieren in Java

C. A. R. Hoare. An Axiomatic Basis for Computer Programming. Nicolas Schelp. Proseminar Assertions SS 2007

Java Einführung Vererbung und Polymorphie. Kapitel 13

Informatik II Musterlösung

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

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

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Qualitätssicherung in der Softwareentwicklung

Algorithmen und Programmieren II Programmverifikation {V} P {N}

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

12 Abstrakte Klassen, finale Klassen und Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces

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

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

WS 05/06 mod Verifikation

1 Abstrakte Klassen, finale Klassen und Interfaces

Java I Vorlesung Vererbung und Sichtbarkeit

Prinzipien Objektorientierter Programmierung

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

Client-Server-Beziehungen

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Java I Vorlesung 6 Referenz-Datentypen

Programmierkurs Java

Vererbung und Polymorphie

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

Interfaces und Vererbung

Java Vererbung. Inhalt

2.4.3 Polymorphie (Wiederholung von Alp2)

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

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

Gebundene Typparameter

Objektorientierte Programmierung Studiengang Medieninformatik

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

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

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Algorithmen und Programmierung II

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

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

Th. Letschert OOP 2 6. Klassenentwurf II

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Einführung in die Programmiersprache Java II

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

Vererbung. Martin Wirsing. Ziele. Vererbung

Einstieg in die Informatik mit Java

Kapselung und Methodenbindung: Javas Designprobleme und ihre Korrektur. Dipl.-Inform. Peter Müller Prof. Arnd Poetzsch-Heffter Fernuniversität Hagen

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Die Schnittstelle Comparable

4. Vererbung Die Klasse Object. Die Klasse Object

Programmiermethodik 3. Klausur Lösung

Kapitel 6. Vererbung

5. Dokumentieren und Testen Advanced Programming Techniques. Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Assertions (Zusicherungen)

Objektorientierte Programmierung Studiengang Medieninformatik

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Th. Letschert OOP 2 1. Vererbung I : Subklasse und Subtyp

Invarianten und sichere Vererbung

Java für Computerlinguisten

Programmiermethodik 1. Klausur

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

Zusammenfassung. Definition. 1 (x i ) 1 i n Sequenz von Registern x i, die natürliche Zahlen beinhalten. 2 P ein Programm. Befehle: 1 x i := x i + 1

Arten von Klassen-Beziehungen

Programmieren in Java

Programmieren in Java

Algorithmen und Datenstrukturen II

Probeklausur: Programmierung WS04/05

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom : Funktionen und Prozeduren

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

3 Objektorientierte Konzepte in Java

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

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

II.4.5 Generische Datentypen - 1 -

Objektorientierte Verträge OOPM, Ralf Lämmel

Statische Methoden, Vererbung, Benutzereingabe

Programmiertechnik Objektorientierung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Einstieg in die Informatik mit Java

Transkript:

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

Inhalt Design by Contract Verträge für prozedurale Programme Verträge für objekt-orientierte Programme Contract Monitoring Verifikation von Verträgen Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 2 / 33

Grundidee Überführe das Konzept eines Vertrags zwischen Geschäftspartnern in die Softwaretechnik Was ist ein Vertrag? Ein bindendes Abkommen, das die Verpflichtungen und Rechte jedes Partners explizit aufführt. Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 3 / 33

Beispiel: Vertrag zwischen Bauherr und Bauunternehmer Bauherr Bauunternehmer Verpflichtungen Stellt 5 ar Land; bezahlt für das Haus, falls dieses rechtzeitig fertig gestellt ist Baut innerhalb von sechs Monaten das Haus auf dem bereitgestellten Land Rechte Erhält das Haus in sechs Monaten Muss nicht arbeiten, falls das bereitgestellte Land kleiner als 5 ar ist; erhält Bezahlung falls das Haus rechtzeitig fertig gestellt ist Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 4 / 33

Verträge für prozedurale Programme Wer sind die Vertragspartner in SE? Partner können sein: Module/Prozeduren, Objekte/Methoden, Komponenten/Operationen,... In einer Softwarearchitektur sind die Komponenten die Partner und jede Verbindung zwischen Komponenten kann einen Vertrag besitzen. Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 5 / 33

Verträge für prozedurale Programme Verträge von prozeduralen Programmen Ziel: Spezifikation von Prozeduren (statischen Methoden) Ansatz: Mache Zusicherungen über die Prozeduren Vorbedingung (Precondition) Muss bei Eintritt in die Prozedur erfüllt sein (d.h. wahr sein) Muss vom Aufrufer der Prozedur sichergestellt werden Nachbedingung (Postcondition) Muss beim Verlassen der Prozedur erfüllt sein Muss von der Prozedur sichergestellt werden, falls diese terminiert Vorbedingung(State) Nachbedingung(procedure(State)) Notation: {Vorbedingung} procedure {Nachbedingung} Zusicherungen in Prädikatenlogik der ersten Stufe oder OCL Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 6 / 33

Verträge für prozedurale Programme Beispiel / @param a an integer @returns integer square root of a / int root (int a) { int i = 0; int k = 1; int sum = 1; while (sum <= a) { k = k+2; i = i+1; sum = sum+k; } return i; } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 7 / 33

Verträge für prozedurale Programme Spezifikation von root Typkorrektheit wird vom Compiler sichergestellt, a integer und root integer (das Ergebnis) 1. root als Funktion auf den natürlichen Zahlen Vorbedingung: a 0 Nachbedingung: root root a < (root + 1) (root + 1) 2. root als Funktion auf den ganzen Zahlen Vorbedingung: true Nachbedingung: (a 0 root root a < (root + 1) (root + 1)) (a < 0 root = 0) Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 8 / 33

Verträge für prozedurale Programme Abschwächen und Verstärken Ziel: Bestmöglicher Vertrag Suche schwächste Vorbedingung d.h., eine Vorbedingung, die durch alle anderen Vorbedingungen impliziert wird größter Nutzen der Prozedur größter Wertebereich der Prozedur (Was bedeutet die Vorbedingung false?) Suche stärkste Nachbedingung d.h.. suche eine Nachbedingung, die alle anderen Nachbedingungen impliziert kleinstmögliche Wertemenge der Prozedur (Was bedeutet die Nachbedingung true?) Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 9 / 33

Verträge für prozedurale Programme Beispiel (schwächste Vorbedingung / stärkste Nachbedingung) Betrachte root als Funktion auf den ganzen Zahlen Vorbedingung: true Nachbedingung: (a 0 root root a < (root + 1) (root + 1)) (a < 0 root = 0) true ist die schwächste Vorbedingung Die Nachbedingung kann verstärkt werden zu (root 0) (a 0 root root a < (root + 1) (root + 1)) (a < 0 root = 0) Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 10 / 33

Verträge für prozedurale Programme Partielle Korrektheit vs Totale Korrektheit... einer Prozedur f mit Vorbedingung P und Nachbedingung Q f ist partiell korrekt: für alle Zustände S: Falls Vorbedingung P für S gilt und f terminiert ausgehend vom Zustand S im Zustand S, dann gilt die Nachbedingung Q für S. f ist total korrekt: für alle Zustände S: Falls Vorbedingung P für S gilt, dann terminiert f ausgehend vom Zustand S im Zustand S und die Nachbedingung Q ist erfüllt für S. Totale Korrektheit verlangt Beweis der Terminierung Totale Korrektheit impliziert partielle Korrektheit Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 11 / 33

Verträge für prozedurale Programme Ein Beispiel Füge ein Element in eine Tabelle fester Größe ein int capacity; // size of table int count; // number of elements in table T get (String key) {...} void put (String key, T element); Vorbedingung: Tabelle ist nicht voll count < capacity Nachbedingung: neues Element in der Tabelle, count ist angepasst count capacity get(key) = element count = old count + 1 Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 12 / 33

Verträge für prozedurale Programme Ein Beispiel Vertrag Aufrufer Prozedur Verpflichtungen Aufruf von put nur auf nicht voller Tabelle Fügt element in Tabelle ein, so dass Zugriff mit Hilfe des Schlüssels key möglich ist Rechte Erhält modifizierte Tabelle, in der das Element element dem Schlüssel key zugeordnet ist Der Fall Tabelle ist voll kann ignoriert werden Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 13 / 33

Verträge für prozedurale Programme Weitere Element eines Vertrages Typsignatur (minimaler Vertrag) Fehler, die geworfen werden (Exceptions) Zeitliche Eigenschaften (Invarianten des Typs) Die Kapazität der Tabelle verändert sich nicht über die Zeit eine Menge, die nur anwachsen kann Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 14 / 33

Verträge für objekt-orientierte Programme Verträge für objekt-orientierte Programme Verträge für Methoden haben zusätzliche Probleme zu behandeln lokaler Zustand Zustand des Empfängerobjekts muss spezifiziert werden Vererbung und dynamischer Methodenaufruf Empfängerobjekt hat zur Laufzeit einen Subtyp des statisch erwarten Typs; Methode kann überschrieben worden sein Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 15 / 33

Verträge für objekt-orientierte Programme Lokaler Zustand Klassen Invarianten Eine Klasseninvariante INV ist ein Prädikat, das für alle Objekte der Klasse gilt Es muss durch alle Konstruktoren sichergestellt werden Muss von allen sichtbaren Methoden erhalten werden Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 16 / 33

Verträge für objekt-orientierte Programme Vor- und Nachbedingungen für Methoden Konstruktoren c sichtbare Methoden m {Pre c } c {INV } {Pre m INV } m {Post m INV } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 17 / 33

Verträge für objekt-orientierte Programme Tabellen Beispiel, die 2. count und capacity sind Instanzvariablen der Klasse Table Klasseninvariante INV Table ist count capacity Spezifikation von void put (String key, T element) Vorbedingung: count < capacity Nachbedingung: get(key) = element count = old count + 1 Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 18 / 33

Verträge für objekt-orientierte Programme Vererbung und dynamische Bindung Subklassen können Methoden überschreiben Auswirkung auf die Spezifikation: Subklassen haben unterschiedliche Invarianten Überschriebene Methoden können unterschiedliche Vor- und Nachbedingungen haben unterschiedliche Fehler werfen Methodenspezialisierung Relation zu den Vor- und Nachbedingungen der Basisklasse? Richtlinie: No surprises requirement (Wing, FMOODS 1997) (keine überraschenden Rechte/Auflagen/Forderungen) Eigenschaften, die von einem Objekt des Typs T erwartet werden, sollten auch für ein Objekt eines Subtypen S von T gelten. Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 19 / 33

Verträge für objekt-orientierte Programme Invarianten einer Subklasse Angenommen class Mytable extends Table... jede Eigenschaft, die von Table erwartet wird, müssen Objekte von Type Mytable ebenfalls erfüllen. Falls o den Typ Mytable hat, dann muss INV Table für o gelten INV Mytable INV Table Beispiel: Mytable kann eine Hashtabelle sein, mit Invariante INV Mytable count capacity/3 Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 20 / 33

Verträge für objekt-orientierte Programme Methodenspezialisierung Falls Mytable die Methode put neu definiert, dann muss... die neue Vorbedingung schwächer sein und die neue Nachbedingung stärker sein denn der Aufrufer garantiert nur Pre put,table und erwartet Post put,table Table cast = new Mytable (150);... cast.put ( Arnie, new Terminator (3)); Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 21 / 33

Verträge für objekt-orientierte Programme Anforderung der Methodenspezialisierung Angenommen eine Klasse T definiert eine Methode m unter den Annahmen Pre T,m und Post T,m, und wirft die Fehler Exc T,m. Falls die Klasse S die Klasse T erweitert und m überschreibt, so ist diese neue Definition eine korrekte Methodenspezialisierung, falls Pre T,m Pre S,m und Post S,m Post T,m und Exc S,m Exc T,m jeder Fehler, der von S.m geworfen wird, konnte auch von T.m geworfen werden (Index!) (Index!) Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 22 / 33

Verträge für objekt-orientierte Programme Beispiel: Mytable.put Pre Mytable,put count < capacity/3 ist keine korrekte Methodenspezialisierung, da es nicht von count < capacity impliziert wird. Mytable kann automatisch die Größe der Tabelle verändern, so dass Pre Mytable,put true Dies wäre eine korrekte Methodenspezialisierung, da count < capacity true! Angenommen, Mytable fügt eine neue Instanzvariable T lastinserted hinzu, die den Wert des letzten eingefügten Elements beinhaltet. Post Mytable,put get(key) = element count = old count + 1 lastinserted = element ist eine korrekte Methodenspezialisierung, da Post Mytable,put Post Table,put Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 23 / 33

Verträge für objekt-orientierte Programme Methodenspezialisierung in Java 5 In Java 5 darf beim Überschreiben einer Methode nur der Rückgabetyp spezialisiert werden (d.h. durch einen Subtyp ersetzt werden). Die Parametertypen müssen unverändert bleiben. (Warum?) Beispiel: Angenommen A extends B class C { A m () { return new A(); } } class D extends C { B m () { // overrides A.m return new B(); } } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 24 / 33

Contract Monitoring Contract Monitoring Was passiert, falls der Vertrag während der Ausführung verletzt wird? Eine solche Ausführung läuft außerhalb der Systemspezifikation. Das Verhalten des Systems kann beliebig sein. Absturz Weiterlaufen Contract Monitoring: Wertet die Zusicherungen zur Laufzeit aus und wirft einen Fehler, falls eine Vertragsverletzung festgestellt wird. Wieso Beobachten? Debugging (mit unterschiedlicher Genauigkeit des Monitorings) Softwarefehlertoleranz (e.g., α und β Releases) Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 25 / 33

Contract Monitoring Welche Fehler können auftreten? Vorbedingung: Werte Bedingung bei Eintritt aus Stelle Problem bei Aufrufer fest Nachbedingung: Werte Bedingung bei Ende der Methode aus Findet Fehler in der aufgerufenen Methode, d.h. in der Methode selbst Invariante: Werte Bedingungen beim Eintritt und Austritt aus Problem der aufgerufenden Klasse Hierarchie: inkorrekte Methodenspezialisierung Muss für alle Superklassen T von S geprüft werden Pre T,m Pre S,m bei Eintritt und Post S,m Post T,m bei Austritt Wie? Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 26 / 33

Contract Monitoring Hierarchieprüfung Angenommen class S extends T und überschreibt die Methode m. Sei T x = new S() und betrachte x.m() beim Eintritt Falls Pre T,m gilt, so muss Pre S,m gelten Es muss PreS,m gelten Beim Austritt Post S,m muss gelten Falls Post S,m gilt, so muss Post T,m gelten Allgemein: Kaskade von Implikationen zwischen S und T Vor- und Nachbedingung werden nur für S geprüft! Wenn Vorbedingung von S nicht gilt, aber die Vorbedingung von T, dann liegt eine inkorrekte Methodenspezialisierung vor Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 27 / 33

Contract Monitoring Beispiel interface IConsole { int getmaxsize(); @post { getmaxsize > 0 } void display (String s); @pre { s.length () < this.getmaxsize() } } class Console implements IConsole { int getmaxsize () {... } @post { getmaxsize > 0 } void display (String s) {... } @pre { s.length () < this.getmaxsize() } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 28 / 33

Contract Monitoring Eine korrekte Erweiterung class RunningConsole extends Console { void display (String s) {... super.display(s.substring ( n, n + getmaxsize() 1));... } @pre { true } } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 29 / 33

Contract Monitoring Eine fehlerhafte Erweiterung class PrefixedConsole extends Console { String getprefix() { return >> ; } void display (String s) { super.display (this.getprefix() + s); } @pre { s.length() < this.getmaxsize() this.getprefix().length() } } Der Aufrufer muss nur die Vorbedingung von IConsole s erfüllen Console.display kann mit zu langem Argument aufgerufen werden Der Programmierer von PrefixedConsole ist schuld! Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 30 / 33

Contract Monitoring Beispiel 2: Fehlerhafte Erweiterung des Interface Programmierer Jim interface I { void m (int a); @pre { a > 0 } } interface J extends I { void m (int a); @pre { a > 10 } } Programmierer Don class C implements J { void m (int a) {... }; @pre { a > 10 } public static void main (String av[]) { I i = new C (); i.m (5); } } Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 31 / 33

Contract Monitoring Eigenschaften des Monitoring Zusicherungen können beliebige seiteneffektfreie Ausdrücke sein Code zur automatischen Prüfung kann aus den Zusicherungen generiert werden Monitoring kann nur das Vorhandensein von Fehlern entdecken, nicht aber ihre prinzipielle Abwesenheit Fehlerfreiheit kann nur durch formale Verifikation sichergestellt werden Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 32 / 33

Verifikation von Verträgen Verifikation von Verträgen Gegeben: Spezifikation von imperativen Prozeduren durch Vorbedingung und Nachbedingung Ziel: Formaler Beweis, dass Vorbedingung(State) Nachbedingung(procedure(State)) Methode: Hoare Logik, z.b., durch ein Deduktionssystem für Hoare Tripel der Form {Vorbedingung} procedure {Nachbedingung} benannt nach C.A.R. Hoare, dem Erfinder von Quicksort, CSP, und vielen anderen Peter Thiemann (Univ. Freiburg) Softwaretechnik SWT 33 / 33