• Keine Ergebnisse gefunden

Aufgabe1JMLI HinweiseundBemerkungenzum9.ÜbungsblattderVorlesung„FortgeschritteneAspekteobjektorientierterProgrammierung(SS2008)“

N/A
N/A
Protected

Academic year: 2022

Aktie "Aufgabe1JMLI HinweiseundBemerkungenzum9.ÜbungsblattderVorlesung„FortgeschritteneAspekteobjektorientierterProgrammierung(SS2008)“"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. Markus Reitz

Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik

Hinweise und Bemerkungen zum 9. Übungsblatt der Vorlesung

„Fortgeschrittene Aspekte objektorientierter Programmierung (SS 2008)“

Aufgabe 1 JML I

a) • Vorteile

– Mathematisch präzise, wodurch die bei natürlich-sprachlicher Spezifikation auftretenden Mehrdeutig- keiten eingeschränkt/vermieden werden können.

– Formale Spezifikationen können ausführbar sein, wodurch semi-automatische Überprüfung durch den Computer möglich wird (→Theorembeweiser etc.).

– „Think before you code“ führt dazu, dass sich der Entwickler eingehender mit der Semantik der von ihm zur Verfügung gestellten Schnittstellen auseinandersetzt, wodurch Fehler und Probleme relativ früh im Entwicklungsprozess entdeckt und behoben werden können.

• „Nachteile“

– Formale Beschreibungen setzen in einem größeren Maß mathematische Kenntnisse und Fähigkeiten voraus als natürlich-sprachliche Spezifikationen.

– Formale Beschreibungen können aufgrund der notwendigen Präzision und Eindeutigkeit umfangreicher als natürlich-sprachliche Spezifikationen sein.

– Problem: Wann ist eine Spezifikation ausreichend detailliert? Wann ist eine Spezifikation vollständig?

b) p u b l i c c l a s s B y t e A r r a y I n p u t S t r e a m e x t e n d s I n p u t S t r e a m { p r o t e c t e d /∗@ s p e c _ p u b l i c n o n _ n u l l @∗/ b y t e[ ] b u f ; p r o t e c t e d /∗@ s p e c _ p u b l i c @∗/ i n t c o u n t ;

p r o t e c t e d /∗@ s p e c _ p u b l i c @∗/ i n t mark ;

p r o t e c t e d /∗@ s p e c _ p u b l i c @∗/ i n t p o s ; /∗@ p u b l i c i n v a r i a n t ( c o u n t>=0 && c o u n t<=b u f . l e n g t h ) &&

@ ( mark>=0 && mark<=c o u n t ) &&

@ ( pos>=0 && pos<=c o u n t ) ;

@∗/

/∗@ r e q u i r e s b !=n u l l ;

@ a s s i g n a b l e b u f , pos , c o u n t , mark ;

@ e n s u r e s b u f==b &&

@ p o s==0 &&

@ c o u n t==b . l e n g t h &&

@ mark==0;

@∗/

p u b l i c B y t e A r r a y I n p u t S t r e a m (b y t e[ ] b ) ; /∗@ r e q u i r e s b !=n u l l &&

@ o f f s e t>=0 &&

@ l e n g t h>=0 &&

@ ( o f f s e t+l e n g t h )<b . l e n g t h ;

@ a s s i g n a b l e b u f , pos , c o u n t , mark ;

@ e n s u r e s b u f==b &&

@ p o s==o f f s e t &&

@ c o u n t==( o f f s e t+l e n g t h<b u f . l e n g t h ) ? o f f s e t+l e n g t h : b u f . l e n g t h &&

@ mark==o f f s e t ;

@∗/

p u b l i c B y t e A r r a y I n p u t S t r e a m (b y t e[ ] b , i n t o f f s e t , i n t l e n g t h ) ;

(2)

/∗@ r e q u i r e s t r u e ;

@ e n s u r e s \r e s u l t==( c o u n t−p o s ) ;

@∗/

p u b l i c /∗@ p u r e @∗/ i n t a v a i l a b l e ( ) ; /∗@ r e q u i r e s t r u e ;

@ e n s u r e s t r u e ;

@∗/

p u b l i c v o i d /∗@ p u r e @∗/ c l o s e ( ) t h r o w s I O E x c e p t i o n ; /∗@ r e q u i r e s t r u e ;

@ a s s i g n a b l e mark ;

@ e n s u r e s mark==p o s ;

@∗/

p u b l i c v o i d mark (i n t r e a d A h e a d L i m i t ) ; /∗@ r e q u i r e s t r u e ;

@ e n s u r e s \r e s u l t==t r u e ;

@∗/

p u b l i c b o o l e a n /∗@ p u r e @∗/ m a r k S u p p o r t e d ( ) ; /∗@ r e q u i r e s t r u e ;

@ a s s i g n a b l e p o s ;

@ e n s u r e s a v a i l a b l e ( )==0 => (\r e s u l t==−1 && p o s==\o l d ( p o s ) ) &&

@ a v a i l a b l e ( )>0 => ( (\r e s u l t==b u f [ p o s ] && p o s==\o l d ( p o s )+1 ) &&

@ \r e s u l t>=0 && \r e s u l t<=2 5 5 ) ;

@∗/

p u b l i c i n t r e a d ( ) ;

/∗@ r e q u i r e s b !=n u l l &&

@ o f f>=0 &&

@ l e n>=0 &&

@ ( o f f+l e n )<b . l e n g t h ;

@ a s s i g n a b l e p o s ;

@ e n s u r e s a v a i l a b l e ( )==0 => (\r e s u l t==−1 && p o s==\o l d ( p o s ) ) &&

@ a v a i l a b l e ( )>0 => ( (\r e s u l t==( l e n<a v a i l a b l e ( ) ) ? l e n : a v a i l a b l e ( ) &&

@ p o s==\o l d ( p o s )+ \r e s u l t ) &&

@ (\f o r a l l i n t k ; 0<k && k<\r e s u l t ; b u f [ o f f+k ]==b [ o f f+k ] ) ) ;

@∗/

p u b l i c i n t r e a d (b y t e[ ] b , i n t o f f , i n t l e n ) ; /∗@ r e q u i r e s t r u e ;

@ a s s i g n a b l e p o s ;

@ e n s u r e s p o s==mark ;

@∗/

p u b l i c v o i d r e s e t ( ) ; /∗@ r e q u i r e s n>=0;

@ a s s i g n a b l e p o s ;

@ e n s u r e s \r e s u l t==( a v a i l a b l e ( )<n ) ? a v a i l a b l e ( ) : n &&

@ p o s==\o l d ( p o s )+ \r e s u l t ;

@∗/

p u b l i c l o n g s k i p (l o n g n ) ; }

Aufgabe 2 JML II

c l a s s F i l e N o t F o u n d E x c e p t i o n e x t e n d s E x c e p t i o n {}

c l a s s F i l e N o t O p e n E x c e p t i o n e x t e n d s E x c e p t i o n {}

c l a s s R e a d O n l y V i o l a t i o n e x t e n d s E x c e p t i o n {}

p u b l i c i n t e r f a c e F i l e A n n o t a t e d { / /@ m o d e l i n s t a n c e b o o l e a n i s O p e n ; / /@ m o d e l i n s t a n c e b o o l e a n i s W r i t e a b l e ;

2

(3)

/∗@

∗ p u b l i c n o r m a l _ b e h a v i o r

∗ r e q u i r e s name !=n u l l && ( w r i t e a b l e | | new j a v a . i o . F i l e ( name ) . e x i s t s ( ) ) ;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ e n s u r e s i s O p e n && i s W r i t e a b l e==w r i t e a b l e ;

∗ a l s o

∗ p u b l i c e x c e p t i o n a l _ b e h a v i o r

∗ r e q u i r e s name==n u l l | | ( ! w r i t e a b l e && ! new j a v a . i o . F i l e ( name ) . e x i s t s ( ) ) ;

∗ a s s i g n a b l e \n o t h i n g ;

∗ s i g n a l s ( F i l e N o t F o u n d E x c e p t i o n ) t r u e ;

∗/

p u b l i c v o i d o p e n ( S t r i n g name , b o o l e a n w r i t e a b l e ) t h r o w s F i l e N o t F o u n d E x c e p t i o n ;

/∗@

∗ p u b l i c n o r m a l _ b e h a v i o r

∗ r e q u i r e s i s O p e n ;

∗ a s s i g n a b l e i s O p e n ;

∗ e n s u r e s ! i s O p e n ;

∗ a l s o

∗ p u b l i c e x c e p t i o n a l _ b e h a v i o r

∗ r e q u i r e s ! i s O p e n ;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ s i g n a l s ( F i l e N o t O p e n E x c e p t i o n ) t r u e ;

∗/

p u b l i c v o i d c l o s e ( ) t h r o w s F i l e N o t O p e n E x c e p t i o n ;

/∗@

∗ p u b l i c n o r m a l _ b e h a v i o r

∗ r e q u i r e s i s O p e n && ! i s W r i t e a b l e ;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ e n s u r e s −1<=\r e s u l t && \r e s u l t <=65535;

∗ a l s o

∗ p u b l i c e x c e p t i o n a l _ b e h a v i o r

∗ r e q u i r e s ! i s O p e n | | i s W r i t e a b l e ;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ s i g n a l s ( F i l e N o t O p e n E x c e p t i o n ) t r u e ;

∗/

p u b l i c i n t r e a d ( ) t h r o w s F i l e N o t O p e n E x c e p t i o n ;

/∗@

∗ p u b l i c n o r m a l _ b e h a v i o r

∗ r e q u i r e s i s O p e n && i s W r i t e a b l e && ch>=0;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ e n s u r e s t r u e ;

∗ a l s o

∗ p u b l i c e x c e p t i o n a l _ b e h a v i o r

∗ r e q u i r e s ! i s O p e n | | ! i s W r i t e a b l e ;

∗ a s s i g n a b l e \e v e r y t h i n g ;

∗ s i g n a l s ( F i l e N o t O p e n E x c e p t i o n ) ! i s O p e n ;

∗ s i g n a l s ( R e a d O n l y V i o l a t i o n ) i s O p e n && ! i s W r i t e a b l e ;

∗/

p u b l i c v o i d w r i t e ( c h a r ch ) t h r o w s F i l e N o t O p e n E x c e p t i o n , R e a d O n l y V i o l a t i o n ; }

3

(4)

Aufgabe 3 Abstraction

Anmerkung:Diese Aufgabe ist angelehnt an „Getting started with JML“ (http://www-128.ibm.com/developerworks/

java/library/j-jml.html).

p u b l i c i n t e r f a c e Queue {

/ /@ p u b l i c m o d e l i n s t a n c e JMLObjectBag e l e m e n t s ;

/∗@

@ p u b l i c n o r m a l _ b e h a v i o r

@ r e q u i r e s ! i s E m p t y ( ) ;

@ e n s u r e s e l e m e n t s I n Q u e u e . h a s (\r e s u l t ) ;

@

@ a l s o

@

@ p u b l i c e x c e p t i o n a l _ b e h a v i o r

@ s i g n a l s ( E m p t y Q u e u e E x c e p t i o n ) i s E m p t y ( )

@∗/

/∗@ p u r e @∗/ O b j e c t p e e k ( ) t h r o w s E m p t y Q u e u e E x c e p t i o n ;

/∗@

@ p u b l i c n o r m a l _ b e h a v i o r

@ a s s i g n a b l e e l e m e n t s

@ r e q u i r e s ! i s E m p t y ( ) ;

@ e n s u r e s e l e m e n t s . e q u a l s ( ( ( JMLObjectBag )\o l d ( e l e m e n t s ) ) . r e m o v e (\r e s u l t ) ) &&

@ \r e s u l t . e q u a l s (\o l d ( p e e k ( ) ) ) &&

@ s i z e ( )= = \o l d ( s i z e ( ) )−1

@

@ a l s o

@

@ p u b l i c e x c e p t i o n a l _ b e h a v i o r

@ s i g n a l s ( E m p t y Q u e u e E x c e p t i o n ) i s E m p t y ( )

@∗/

O b j e c t d e q u e u e ( ) t h r o w s E m p t y Q u e u e E x c e p t i o n ;

/∗@

@ a s s i g n a b l e e l e m e n t s

@ e n s u r e s e l e m e n t s . e q u a l s ( ( ( JMLObjectBag )\o l d ( e l e m e n t s ) ) . add ( i t e m ) ) &&

@ s i z e ( )= = \o l d ( s i z e ( ) )+1

@∗/

v o i d e n q u e u e ( O b j e c t i t e m ) ;

/∗@

@ e n s u r e s \r e s u l t==e l e m e n t s . i s E m p t y ( ) &&

@ s i z e ( )>0 => ! i s E m p t y ( ) &&

@ s i z e ( )==0 => i s E m p t y ( )

@∗/

/∗@ p u r e @∗/ b o o l e a n i s E m p t y ( ) ;

/∗@

@ e n s u r e s \r e s u l t==e l e m e n t s . s i z e ( ) &&

@ i s E m p t y ( ) => s i z e ( )==0 &&

@ ! i s E m p t y ( ) => s i z e ( )>0

@∗/

/∗@ p u r e @∗/ i n t s i z e ( ) ; }

c l a s s E m p t y Q u e u e E x c e p t i o n e x t e n d s E x c e p t i o n {}

4

Referenzen

ÄHNLICHE DOKUMENTE

} idiom used within the next() method in the source code of class Permutations. Which value is returned by the following code fragment?.. b) Because of the type erasure

Check the following source code fragments with respect to violation or fulfillment of the Behavioural Subtype property as introduced in the lecture. What is the complete

ET++ was developed during the late 80s and early 90s of the last century as a framework providing a rich set of building blocks for the construction of „typical“ desktop

a) Nein, bei der Klasse Proxy handelt es sich um eine Klasse, die nicht allein mit den Mitteln der Programmiersprache Java realisiert werden kann.. Dies ist der Fall, wenn es sich

Im wesentlichen werden die Log-Aufrufe an eine speziell für das Logging zuständige Instanz, deren Klasse aus der ursprünglichen LoggableClass Klasse hervorgeht, mittels

Der oben angegebene try-catch Block „fängt“ alle Exceptions vom Typ Exception, sowie von Exception abgeleitete Typen wie beispielsweise IOException. Angenommen, innerhalb des

C5: Diese Regel ist erfüllt, da die Klasse StringDataSource keinen Konstruktor besitzt, und der Konstruktor ihrer Superklasse java.lang.Object ist leer (http: // www.docjar.com / html

Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik. Hinweise und Bemerkungen