• Keine Ergebnisse gefunden

Java Modeling Language (JML) und Design by Contract (DbC)

N/A
N/A
Protected

Academic year: 2022

Aktie "Java Modeling Language (JML) und Design by Contract (DbC)"

Copied!
29
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Java Modeling Language (JML) und Design by Contract (DbC)

Thomas Ruhroth

16. Juni 2011

(2)

Ubersicht - Inhaltliche Abh¨ ¨ angigkeiten

algeb. Spezifikationen

Hoare Tripple

Java UML

Design by Contract

JML OCL

(3)

Von algb. Spezifikationen zu Design by Contract

Vorgehen

I Ausgang: algb. Spezifikationen

I + Nutzung von Pr¨adikatenlogik 1. Ord.

I + Abstraktion

I Ziel: Design by Contract

Mein Beispiel

Test, ob in einem Integer-Array nur positive Zahlen enthalten sind.

Ihr Beispiel

Bestimmen des maximalen Wertes in einem Integer-Array.

(4)

Int-Array

Array

algebraIntArrayintroduces sortsint,nat0,bool,IntArray;

operations

create:nat0IntArray set:IntArray,nat0,intIntArray get:IntArray,nat0int size:IntArraynat0 constraintscreate,set,get,size

so that for all st :IntArray,m:int; n:nat0 size(create(n) =n

n<size(st)size(get(st,n)) =size(st) n<size(st)get(set(st,n,m),n) =m

isPositive

operations . . .

isPositive:IntArraybool tailarray(st) :IntArrayIntArray constraints . . . ,isPositive . . .

size(st) =0isPositive=true

size(st)>0isPositive=isPositive(tailarray(st)) andget(st,0)>0

(5)

isPositive

operations . . .

isPositive :IntArray →bool constraints . . . ,isPositive . . .

∀i ∈int |0≤i<size(st)•get(st,i)>0

∧size(st)>0⇔isPositive(st)

(6)

isPositive

operations . . .

isPositive :IntArray →bool constraints . . . ,isPositive. . .

(∀i ∈int |0≤i<size(st)•get(st,i)>=0)

⇔isPositive(st) Maximum

operations . . . max :IntArray →int constraints . . . ,max. . .

∃i ∈int |0≤i <size(st)•max(st) =get(st,i)

∀j ∈int |0≤i <size(st)•get(st,i)<=max(st) Achtung!

Das sind keine algb. Spezifikationen im engeren Sinn mehr!

Aufpassen in der Klausur!

(7)

Maximum

operations . . . max :IntArray →int constraints . . . ,max. . .

∃i ∈int |0≤i <size(st)•max(st) =get(st,i)

∀j ∈int |0≤i <size(st)•get(st,i)<=max(st)

Die Aussage

I f¨ur alle!

I Vorbedingung: size(st)>0

I Nachbedingung:

∃i ∈int |0≤i <size(st)•max(st) =get(st,i)

∀j ∈int |0≤i <size(st)•get(st,i)<=max(st)

(8)

Design by Contract

F¨ur jede Methode/Operation/Funktion

I Die Vorbedingung beschreibt die Bedingungen, damit die Methode/Operation/Funktion richtig funktioniert

I Die Nachbedingung beschreibt den Zustand, falls die Funktion richtig funktioniert hat

Wenn ein Operationsaufruf die Vorbedingung beachtet, kann der Aufrufer sich darauf verlassen, dass die Nachbedingung erf¨ ullt wird!

Weitere Angaben

I Invariante: Bedingungen, die von einer Einheit (Klasse, Modul, Block...) immer erf¨ullt werden m¨ussen.

I Angabe von Dingen, die nicht passieren d¨urfen:

I Schreibverbot f¨ur Variablen

I ...

(9)

Sprachen und Erweiterungen

Sprachen

I Eiffel: Sprache baut direkt auf Design by Contract auf

I D: Design by Contract Unterst¨utzung

Sprachen

I Java: JML - Java Modeling Language

I .NET: Code Contracts (MS)

I ...

(10)

DbC und Object-Orientierung

I Klassen k¨onnen Invarianten besitzen

I Unterklassen sind behavioural Subtyps

Behavioural Subtypes

Eine Klasse bzw. deren Operationen k¨onnen sich nur konform zur Oberklasse verhalten.

I Jede Invariante der Oberklasse ist eine Invariante der Unterklasse.

I Die Vorbedingung der Operationen der Oberklasse impliziert die Vorbedingung der Unterklasse.

I Die Nachbedingung der Operationen der Unterklasse implizieren die Nachbedingungen der Oberklasse.

Achtung!

Unterklassen in Programmiersprachen sind im Allgemeinen keine Behavioural Subtypes!

(11)

Behavioural Subtypes: Beispiel

Oberklasse

I var int i

Invariant : abs(i)<10

I op inc

pre: 0<=a∧a<2∧ old(i)<6

post: old(i) +a==new(i)

Unterklasse

I var int i

Invariant : abs(i)<20 Achtung hier gilt die Inv der Oberklasse!

I op inc

pre: 0<=a∧a<2∧ old(i)<7

post: old(i) +a==

new(i)∧new(i)<8

(12)

JML

Java Modeling Language

JML ist eine DbC-Erweiterung f¨ur Java

Tools

Es gibt eine reiche Toolunterst¨utzung:

I Laufzeitpr¨ufung (jmlrc, jml2tools, rac)

I Statische Analyse

I Beweissysteme (Key, Daphne)

(13)

JML: Eine Einf¨ uhrung

JML-Kommentare /*@ JML-Code

@ JML-Code

@*/

I Code bleibt mit Standard-Tools kompilierbar

I JML-Tools k¨onnen JML-Code auswerten

I Ahnlich wie JavaDoc¨

(14)

Einfaches Beispiel

//@ requires x >= 0.0;

/*@ ensures JMLDouble

.approximatelyEqualTo(x, \result * \result, eps);

@*/

public static double sqrt(double x) { return Math.sqrt(x);

}

(15)

Ausdr¨ ucke

Java Ausdr¨ucke

I Pr¨adikate: x >= 0.0

I Boolesche Verkn¨upfungen: a != null && a == b+7

I Achtung: Nur seiteneffektfreie Methoden und Operationen:

Kein =, +=, ++, ...

Erweiterungen

I Variablen: \result

I Boolesche Operatoren: <==>,

I Quantoren: \forall

I Modifikatoren f¨ur Variablen: \old(.)

(16)

JML- Erweiterte Ausdr¨ ucke

Operatoren

\result Ergebnis eines Methodenaufrufs a ==> b a impliziert b

a <== b b impliziert a

a <==> b a genau dann wenn b a <=!=> b not (a genau dann wenn b)

\old(E) Wert von E im Vorzustand

(17)

JML- Quantoren

Operatoren

\forall Allquantor (∀)

\exists Existenz-Quantor (∃)

\sum Summe (P

)

\product Produkt (Π)

\no_of Anzahl

Achtung, m¨ussen immer in Klammern stehen und haben drei Teile.

Ahnlich wie eine For-Anweisung in Java.¨

(\forall int i; i < 10 && i > 0; p(i))

(18)

Beispiel

Aufgabe:

Bestimme die H¨aufigkeit eines Zahlenwertes in einem Integer-Array.

Eine L¨osung

/*@ normal_behaviour

@ requires a != null;

@ ensures \result == (\no_of int j; j >= 0 && j < a.size(); a[j] == i );

@ exceptional_behaviour

@ requires a == null;

@ signal_only Exception;

@*/

public int count(int[] a, i) throws Exception

I Normales Verhalten: normal_behaviour

I Ausnahme: exceptional_behaviour

(19)

Beispiel

Aufgabe:

Bestimme die H¨aufigkeit eines Zahlenwertes in einem Integer-Array.

Eine L¨osung

/*@ normal_behaviour

@ requires a != null;

@ ensures \result == (\no_of int j; j >= 0 && j < a.size();

a[j] == i );

@ exceptional_behaviour

@ requires a == null;

@ signal_only Exception;

@*/

public int count(int[] a, i) throws Exception

I Normales Verhalten: normal_behaviour

I Ausnahme: exceptional_behaviour

(20)

Aufgaben

Spezifizieren sie die Methode ggT:

public int ggT (int a, int b) { ...

Eine L¨osung:

\*@ normal_behaviour requires a > 0 && b > 0;

@ ensures a % \result == 0

&& b % \result == 0

&& (\forall int i;

i <= a && i <= b && i > \result; a % i != 0 || b % i != 0)

(21)

Aufgaben

Spezifizieren sie die Methode ggT:

public int ggT (int a, int b) { ...

Eine L¨osung:

\*@ normal_behaviour requires a > 0 && b > 0;

@ ensures a % \result == 0

&& b % \result == 0

&& (\forall int i;

i <= a && i <= b && i > \result;

a % i != 0 || b % i != 0)

(22)

Aufgabe

Bestimme das erste Auftreten eines Zahlenwertes in einem Integer-Array.

public int first(int[] a, i) throws Exception

(23)

Eine L¨osung:

/*@ normal_behaviour

@ requires a != null && (\exists int v; j < a.size()

&& j >= 0 ; a[j] == i);

@ ensures (/forall int j; j >= 0 && j < \result;

a[j] != i) && a[\result] != i;

@ normal_behaviour

@ requires a != null && (\forall int j; j < a.size()

&& j >= 0 ;a[j] != i);

@ ensures \result == -1;

@ exceptional_behaviour

@ requires a == null;

@ signal_only Exception;

@*/

public int first(int[] a, i) throws Exception

(24)

Pure Methoden

Seiteneffekte

Ein Seiteneffekt ist eine ¨Anderung des inneren Zustandes einer Klasse oder eines Systems

JML-Ausdr¨ucke und Seiteneffekt

F¨ur die Auswertung eines JML-Ausdruckes muss die Operation ausgef¨uhrt werden k¨onnen. Dabei ist es nicht gewollt, dass sich der Zustand des Systems ¨andert.

Schl¨usselwort pure

pure vor einer Methodendefinition verbietet Seiteneffekte. Dies Methode kann in JML-Ausdr¨ucken verwendet werden.

(25)

Beispiel

/*@ requires x >= 0.0;

@ ensures JMLDouble

.approximatelyEqualTo(x, \result * \result, eps);

@*/

public static /*@ pure */ double sqrt(double x) { return Math.sqrt(x);

}

(26)

Aufgaben

Spezifizieren Sie die Methode kgV:

public int kgV (int a, int b) { ...

Eine L¨osung:

\*@ normal_behaviour requires a > 0 && b > 0;

@ ensures \result == a * b / ggT (a,b);

Achtung: ggT muss alspure definiert sein.

(27)

Aufgaben

Spezifizieren Sie die Methode kgV:

public int kgV (int a, int b) { ...

Eine L¨osung:

\*@ normal_behaviour requires a > 0 && b > 0;

@ ensures \result == a * b / ggT (a,b);

Achtung: ggT muss alspure definiert sein.

(28)

Aufgaben

Bestimme das Maximum eines Integer-Arrays:

public int max(int [] a);

Bestimme die H¨aufigkeit des Maximum eines Integer-Arrays:

public int no_max(int [] a);

(29)

Aufgaben

Eine L¨osung:

/*@ requires a != null && (array.size() > 0)

@ ensures (/forall int j; j < array.size();

a[j] <= \result)

&& /\exists int i| 0 <= i && i < a.size();

\result == a[i]; @*/

public /*@ pure */ int max(int[] a, i) { ...

/*@ requires a != null && (array.size() > 0)

@ ensures \result == count(a,max(a)) \\

@*/

// Achtung count muss mit pure gekennzeichnet sein...

public int no_max(int [] a) { ...

Referenzen

ÄHNLICHE DOKUMENTE

Bei einem Versuch zur Längenänderung eines Kupferrohres in Abhängigkeit von der Temperat ur wird folgende Messreihe aufgenommen..

f c) Wenn sich ein Körper erwärmt, steigt die Temperatur seiner Teilchen. f d) Das Volumen der Teilchen eines Körpers ist ein Maß für dessen

Woher stammt das Elektron beim ß-Zerfall, wie entsteht es (Skizze)3. Formuliere die

Variante 2: Die Familie aller nicht-leeren Mengen der Form f −1 ((−∞, a]) mit a ∈ R hat nat¨ urlich die endliche Durchschnittseigenschaft, wegen Kompaktheit ist der Durchschnitt

Hinweis: Zur Bestimmung von u k¨ onnen Sie eine beliebige Implementation des Newton Algo- rithmus verwenden.. (c) Implementieren Sie das explizite

* Werden Vektoren unterschiedlicher l¨ ange ¨ ubergeben, so soll eine aussagekr¨ aftige Fehlermeldung die Folge seien.. Hinweis: Die mit * gekennzeichneten Punkte

While in many cases the contract is about the same length as the code (as shown in Figure 2), in some cases it can be consider- ably shorter (for example, if the code for

” ·“ bezeichnet man als Gruppe, wenn sie die Bedingungen (F6), (F7) und (F8) aus der Definition 2.1.1 (ohne die Eindeutigkeitsforderung an die Inverse) erf¨ ullt. Geben Sie ein