1 / 16

Design by Contract with JML - Teil 2

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. I. Motivation.

Download Presentation

Design by Contract with JML - Teil 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design by Contract with JML - Teil 2 Alexander Klaas Proseminar Assertions Prof. Dr. Heike Wehrheim Universität Paderborn

  2. Übersicht • Motivation • Einführung Modellvariablen • Modellmethoden • Methoden ohne Seiteneffekte • Praktisches Beispiel • Weitere Konzepte Design by Contract with JML - Teil 2

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. V. Praktisches Beispiel Beispiel Vorführung Design by Contract with JML - Teil 2

  15. 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

  16. VI. Weitere Konzepte • Beispiel Refinement: //@ model instance String gender; protected booleangen; //@ protected representsgender <- (gen ? "female" : "male"); Design by Contract with JML - Teil 2

More Related