• Keine Ergebnisse gefunden

Formale Methoden

N/A
N/A
Protected

Academic year: 2022

Aktie "Formale Methoden"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. Hans-Jürgen Buhl Praktische Informatik/Numerik Fakultät für

Mathematik und Naturwissenschaften, Mathematik und Informatik

E-MAIL buhl@math.uni-wuppertal.de WWW www.math.uni-wuppertal.de/~buhl DATUM 14. Mai 2018

Formale Methoden

SS 2018 – Übungsblatt 4 Ausgabe: 10. Mai 2018

Abgabe bis 17. Mai 2018 an:mailto:Daniel.Schiller@uni-wuppertal.de

Aufgabe 1. ParameterDirectionKind, subsets Namespace::ownedRule

Welche C++-Typmodifizierer werden (vermutlich) bei der Abbildung von Modellen auf Code- Eigenschaften für die UML-ParameterDirectionKinds

(vgl.http://msdn.microsoft.com/de-de/library/microsoft.visualstudio.uml.classes.parameterdirectionkind.aspx) genutzt?

Betrachten Sie in Abschnitt 9.6 (Operations) der UML 2.5 Specification die Figure 9.13.

Erläutern Sie diesubsets-Eigenschaft der Rollenprecondition undpostcondition.

Warum ist es wichtig, für (fast) alle Methoden (Operationen) Vor- und Nachbedingungen ex- plizit anzugeben?

Aufgabe 2. Redesign Sparbuch

Designen Sie das Sparbuch aus Übungsblatt 2 neu nach den Prinzipien objektorientier- ter Programmierung (abstrakte Klasse Waehrung, abstrakte Klasse Konto, ...) und der SdV (welche grundlegenden Observatoren sind nötig, welche Modifikatoren, ...). Konstruie- ren Sie inpapyrusdie nötigen Diagramme. Vergessen Sie nicht entsprechende subsets- Eigenschaften der verschiedenen Buchungstypen explizit anzugeben.

Konzipieren Sie einen «datatype»Datum und eine Methode Zinstage, die die Anzahl der wirksamen Zinstage jedes Datums nach der kaufmännischen Zinsrechnung (12 * 30 Tage) bestimmt. Wie kann das Ergebnis dieser Methode in OCL spezifiziert werden? Welche Inva- riante sollteDatumbesitzen?

(2)

Aufgabe 3. OclVoid und null; Real

Informieren Sie sich im OCL2.4-Manual über den DatentypOclVoid. Wozu kann er benutzt werden?

Welche Operationen gibt es für denprimitive typeReal in der OCL-Spezifikation? Erläu- tern Sie die Nachbedingung der Operationround(). Warum wird in dieser die Zeichenfolge

"abs()"so unüblich benutzt?

Aufgabe 4. Ein Code-Contract

Erläutern Sie die Prinzipien der SdV

Spezifikation durch Vertrag - eine Basistechnologie ...

an folgendem Beispiel:

. . .

template <class T>

set <T> operator+(const set <T>& s , const T& e ) { . . .

} ; . . .

template <class T>

set <T> operator−(const set <T>& s , const T& e ) { . . .

} ; . . .

class m y d i c t i o n a r y { public:

/ / / / / / / / / / / / / / / / b a s i c q u e r i e s :

unsigned i n t get_count ( ) const; / / number o f key / v aluep a i r s i n d i c t . bool has (const KEY& k ) const; / / key i n d i c t i o n a r y ?

VALUE v a l u e _ f o r (const KEY& k ) const; / / look up v a l u e f o r key / / / / / / / / / / / / / / / c l a s s i n v a r i a n t :

pr ivat e:

v i r t u a l bool i n v a r i a n t ( ) const; public:

/ / / / / / / / / / / / / / / d e r i v e d q u e r i e s : / / n o t y e t necessary

/ / / / / / / / / / / / / / / c o n s t r u c t o r s and d e s t r u c t o r s : m y d i c t i o n a r y ( ) ;

~ m y d i c t i o n a r y ( ) ;

/ / / / / / / / / / / / / / / copy c o n s t r u c t o r

m y d i c t i o n a r y (const m y dic tionar y <KEY, VALUE>& s ) ;

/ / / / / / / / / / / / / / / d e a c t i v a t e o p e r a t o r =

Seite 2

(3)

pr ivat e:

m y d i c t i o n a r y& operator=(const m y dic tionar y <KEY, VALUE>& s ) ; public:

/ / / / / / / / / / / / / / / ( pure ) m o d i f i c a t o r s void put (const KEY& k , const VALUE& v ) ;

/ / p u t key / v aluep a i r i n d i c t . void remove (const KEY& k ) ;

/ / remove key / v aluep a i r } ;

. . .

template<class KEY, class VALUE>

unsigned i n t m y dic tionar y <KEY, VALUE> : : get_count ( ) const{ REQUIRE( i n v a r i a n t ( ) ) ;

. . . } ; . . .

template<class KEY, class VALUE>

bool m y dic tionar y <KEY, VALUE> : : has (const KEY& k ) const { REQUIRE( i n v a r i a n t ( ) ) ;

. . .

ENSURE( /c o n s i s t e n t w i t h c ount/ ( get_count ( ) != 0) | | ! r e s u l t ) ; . . .

} ; . . .

template<class KEY, class VALUE>

VALUE m y dic tionar y <KEY, VALUE> : : v a l u e _ f o r (const KEY& k ) const{ REQUIRE( i n v a r i a n t ( ) ) ;

REQUIRE(/key i n d i c t ./ has ( k ) ) ; . . .

} ; . . .

template<class KEY, class VALUE>

m y dic tionar y <KEY, VALUE> : : m y d i c t i o n a r y ( ) { . . .

ENSURE( i n v a r i a n t ( ) ) ; ENSURE( count == 0 ) ; } ;

. . .

template<class KEY, class VALUE>

m y dic tionar y <KEY, VALUE> : : ~ m y d i c t i o n a r y ( ) { REQUIRE( i n v a r i a n t ( ) ) ;

. . . } ; . . .

template<class KEY, class VALUE>

m y dic tionar y <KEY, VALUE> : : m y d i c t i o n a r y (const

m y dic tionar y <KEY, VALUE>& s ) { . . .

ENSURE( get_count ( ) == s . get_count ( ) ) ; . . .

ENSURE( i n v a r i a n t ( ) ) ; } ;

Seite 3

(4)

. . .

template<class KEY, class VALUE>

void m y dic tionar y <KEY, VALUE> : : put (const KEY& k , const VALUE& v ) DO

REQUIRE(/key n o t i n d i c t ./ ! has ( k ) ) ; ID (unsigned i n t count_old = get_count ( ) ) ;

. . .

ENSURE(/c ount inc rem ented/ get_count ( ) == count_old + 1 ) ; ENSURE(/key i n d i c t ./ has ( k ) ) ;

ENSURE(/c o r r e c t v a l u e/ v a l u e _ f o r ( k ) == v ) ; END;

. . .

template<class KEY, class VALUE>

void m y dic tionar y <KEY, VALUE> : : remove (const KEY& k ) DO

REQUIRE(/key i n d i c t ./ has ( k ) ) ; ID (unsigned i n t count_old = get_count ( ) ) ;

. . .

ENSURE(/c ount decremented/ get_count ( ) == count_old − 1 ) ; ENSURE(/key n o t i n d i c t ./ ! has ( k ) ) ;

. . . END;

. . .

i n t main ( ) { . . .

}

Die Abfrage has(k) reicht aus, genau spezifizieren zu können, wann put(k,v) und remove(k)aufgerufen werden dürfen und welchen Haupteffekt ihre Aufrufe jeweils haben.

Sie reicht jedoch nicht aus, um die vollständige Wirkung von put() beziehungsweise remove()spezifizieren zu können (Framebedingung). Wie müssten die grundlegenden Ob- servatoren geändert werden, um auch dies zu erlauben?

Aufgabe 5. Design by Contract/Spezifikation durch Vertrag Der Artikel

Design by Contract

beschreibt ebenfalls die Methodik der Codeverträge. Welche Vorteile sieht der Autor in der Benutzung von internen Selbsttests?

Beantworten Sie mit Hilfe vonhttp://de.wikipedia.org/wiki/Design_by_contract#Sprachunterst.C3.BCtzung und http://c2.com/cgi/wiki?DesignByContract, welche Programmiersprachen die Methodik

DbC von Haus aus, welche erst mit Hilfe zusätzlicher externer Tools unterstützen?

Seite 4

Referenzen

ÄHNLICHE DOKUMENTE

Ein abstrakter Datentyp (ADT) besteht aus einem (oder mehreren) Typen und Operationen darauf, mit folgenden Eigenschaften:. I Werte des Typen können nur über die

Signatur: Typ und Operationen eines ADT Axiome: ¨ uber Typen formulierte Eigenschaften Spezifikation = Signatur + Axiome. Interface zwischen Implementierung und Nutzung Testen zur

Die Klauseln type ‚a T und type object sind in den obigen Beispielen erforderlich, denn anderenfalls würden sich die nachfolgenden Definitionen auf Typen ‚a T und object bezie- hen,

Wenn in einer &#34;Klasse&#34; KEINE Methode implementiert ist, wird sie als interface &#34;Schnittstelle&#34; bezeichnet. public interface

• Wird ein vordefiniertes Element in einem anderen Modul durch zusätzliche Attribute erweitert,. wird an den Elementnamen ein &amp; angehängt Beispiel:

Eine abstrakte Maschine ist eine idealisierte Hardware, für die sich einerseits.. “leicht” Code erzeugen lässt, die sich andererseits aber auch “leicht” auf realer

Ein Interface kann aufgefasst werden als eine abstrakte Klasse, wobei:.. • alle Objekt-Methoden

Designen Sie das Sparbuch aus Übungsblatt 2 neu nach den Prinzipien objektorientier- ter Programmierung (abstrakte Klasse Waehrung, abstrakte Klasse Konto, ...) und der SdV