160 likes | 236 Views
Explore the advanced concepts of design by contract using Java Modeling Language (JML) with real-world examples and practical applications. Learn about modeling variables, methods without side effects, and more.
E N D
Design by Contract with JML - Teil 2 Alexander Klaas Proseminar Assertions Prof. Dr. Heike Wehrheim Universität Paderborn
Übersicht • Motivation • Einführung Modellvariablen • Modellmethoden • Methoden ohne Seiteneffekte • Praktisches Beispiel • Weitere Konzepte Design by Contract with JML - Teil 2
I. Motivation • Spezifikation soll abstrahieren • Dokumentation • Modularität • Wartbarkeit • Trennung von Code und Spezifikation wünschenswert • Problem: Datenstrukturen von Implementierung abhängig Design by Contract with JML - Teil 2
I. Motivation • Beispiel: public class Person { private /*@ spec_public@*/ String name; /*@ requires n != null && !n.equals(""); @ ensures n.equals(name); @*/ public Person(String n){ name=n; };} • Namen nun lieber getrennt nach Vor- und Nachnamen speichern private String first_name; private String last_name; Spezifikation ist public! first_name=n.split(" ")[0]; last_name=n.split(" ")[1]; Design by Contract with JML - Teil 2
I. Motivation • Lösungsansatz 1: Helfervariablen • Im Beispiel: name wie gehabt zusätzlich beibehalten • Nachteile: • Speicherverbrauch selbst bei Kompilierung ohne JML • muss konsistent gehalten werden • kann nicht in interfaces verwendet werden • Lösungsansatz 2: Abfragemethoden • Im Beispiel: getFullName() konkateniert first_name und last_name • Nachteile: • erhöht Umfang des Programmcodes • Zweck der Methode nicht klar ersichtlich • besser: Modellvariablen Design by Contract with JML - Teil 2
II. Einführung Modellvariablen • Variablen, die in der Spezifikation deklariert werden • Verhältnis zu echten Variablen mittels Abstraktionsfunktion Modellvariable Im Beispiel: Konkatenation Abstraktions-funktion Echte Variable Design by Contract with JML - Teil 2
II. Einführung Modellvariablen public class Person { private String first_name; private String last_name; /*@ public model instance String name; @ private representsname <- first_name+" "+last_name; @ @ requires n != null && !n.equals(""); @ ensures n.equals(name); @*/ public Person(String n){ first_name=n.split(" ")[0]; last_name=n.split(" ")[1]; };} Abstraktionsfunktion Design by Contract with JML - Teil 2
II. Einführung Modellvariablen • Änderungen ohne Auswirkung auf Klienten (represents Ausdrücke sind private) • Zweck einer Variable klar • Transparent – ohne Auswirkung auf Implementierung • auch in interfaces verwendbar Design by Contract with JML - Teil 2
III. Modellmethoden • Analog Methoden, die in Spezifikation mit Modifikator model deklariert werden • Insbesondere für Abstraktionsfunktion benutzt als auch für Invarianten, Vor- und Nachbedingungen • Darf keine Seiteneffekte haben => als puregekennzeichnet Design by Contract with JML - Teil 2
IV. Methoden ohne Seiteneffekte • Da JML transparent auf die Implementierung sein soll, darf der Zustand des Programmes nicht beeinflusst werden • Java-Zuweisungsausdrücke (=, ++, --) nicht erlaubt • Methoden müssen als pure gekennzeichnet werden, um in JML verwendet werden zu können Design by Contract with JML - Teil 2
IV. Methoden ohne Seiteneffekte • Zusammen mit spec_public kann man echten Methoden und Variablen ansehen, wo sie genutzt werden • Nur in Spezifikation (model), beides, oder nur in Implementierung • Im Beispiel: Falls voller Name auch in Implementierung gebraucht wird, bietet sich eine Abfragemethode an: /*@ ensures n.equals(getFullName()); @*/ … private /*@ pure spec_public @*/ String getFullName(){ return first_name+" "+last_name; } Design by Contract with JML - Teil 2
V. Praktisches Beispiel Abstrakteres Beispiel: • Erinnerung Suchbaum: • Alle Elemente im linken Teilbaum kleiner, im rechten größer • Durchlaufen In-Order gibt Elemente sortiert aus Modellvariable Sortierte Liste Abstraktions-funktion In-Order-Treewalk Echte Variable Suchbaum Quelle Grafik: Vorlesung Datenstrukturen und Algorithmen SS2005 bei Prof. Dr.rer.nat. Johannes Blömer, http://wwwcs.uni-paderborn.de/cs/ag-bloemer/lehre/dua_SS2005/material/13_suchbaeume.pdf Design by Contract with JML - Teil 2
V. Praktisches Beispiel private static /*@ spec_public @*/ Node set; /*@publicmodelstatic LinkedList sorted_list; @private representssorted_list <- In_Order_Treewalk(set); @ private model pure LinkedList In_Order_Treewalk(Node x){ @ … @ } @ ensures @ (\forall int i; 0 <= i && i < sorted_list.size(); @ sorted_list.itemAt(i) instanceof Integer) @ && (\forall int i; 0 < i && i < sorted_list.size(); @ ((Integer)sorted_list.itemAt((int)(i - 1))) @ .compareTo(sorted_list.itemAt(i)) <= 0) @ && sorted_list.contains(integer_to_add); @*/ public static void add(Integer integer_to_add){ … } Design by Contract with JML - Teil 2
V. Praktisches Beispiel Beispiel Vorführung Design by Contract with JML - Teil 2
VI. Weitere Konzepte • Ghostvariablen: ohne Relation zu echten Variablen • reine Hilfsvariablen z.B. in Modellmethode • Refinement: induktiv von Spezifikation zu Implementierung • Aus abstrakten Modellvariablen kann man später echte Variablen der Implementierung gewinnen • JML: Modellvariablen werden vererbt Design by Contract with JML - Teil 2
VI. Weitere Konzepte • Beispiel Refinement: //@ model instance String gender; protected booleangen; //@ protected representsgender <- (gen ? "female" : "male"); Design by Contract with JML - Teil 2