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 ) ;
/∗@ 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
/∗@
∗ 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
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