Object Constraint Language (OCL) per Stack nel pacchetto java.util


10

Ho un esame in arrivo e sto guardando documenti precedenti per avere alcune idee su cosa aspettarsi. Sono un po 'bloccato sul seguente e apprezzerei molto se qualcuno potesse dare alcune risposte di esempio.

Scrivi precondizioni e postcondizioni in OCL per ognuna delle seguenti operazioni (incluse nella classe Stack nel pacchetto java.util):

  • (1) Boolean empty () - Verifica se questo stack è vuoto
  • (2) E peek () - Guarda l'oggetto in cima a questa pila senza rimuoverla
  • (3) E pop () - Rimuove l'oggetto nella parte superiore di questa pila e restituisce l'oggetto come valore di questa operazione
  • (4) E push (oggetto E) - spinge un oggetto in cima a questa pila

Qui E indica il tipo di elementi nella pila.

I miei tentativi sono i seguenti:

Boolean empty()
pre: none
post: self -> IsEmpty() = true
//should this be result -> IsEmpty() = true because it returns a boolean value?

E peek()
pre: self -> NotEmpty() = true
post: result = ??? 
// I lose hope at this stage. 

Inoltre non so se dovrei fare riferimento agli elementi nello stack. Ad esempio: self.elements -> IsEmpty () = true

Se qualcuno potesse aiutarmi, lo apprezzerei davvero.

MODIFICARE

Un amico ha le seguenti idee:

context Stack empty()
pre: self.data.size = 0

context Stack peek()
pre: self.data.AsSequence.first

context Stack pop()
pre: !self.data.isEmpty
post: self.data.AsSequence.first.remove (not sure about this one)
post: self.data.count = @pre:data - 1

context Stack push(E Item)
post: self.data.asSquence.prepend(E.asSequence)
post: self.data.size = @pre.data.size + 1

Se non ottieni alcun aiuto qui, puoi provare il gruppo UMLforum su Google Gruppi.
Stephen C,

1
O forse su StackOverflow :-)
Stephen C,


Risposte:


1

Pre e postcondizioni sono un contratto.

  • Presupposto è la parte del contratto che il chiamante deve soddisfare. In caso contrario, truela funzione deve generare un errore.
  • Postcondition è la parte del contratto che deve essere soddisfatta dalla funzione e descrive il cambiamento atteso per l'oggetto / mondo. In caso contrario, truel'implementazione presenta un bug.

Sia pre che postcondizione devono essere espressioni booleane.

Prendiamo empty?come esempio. Questa funzione può sempre essere chiamata, quindi non c'è precondizione. E la funzione non ha effetti collaterali, quindi non c'è postcondizione.

Facciamo popun altro esempio. Se questa funzione solleva un'eccezione su uno stack vuoto, la condizione preliminare è self.size > 0, d'altra parte, se la funzione ritorna nilsu uno stack vuoto non vi è alcuna condizione preliminare. Entrambe sono scelte di progettazione valide, non familiari con la scelta di Java. In entrambi i casi il postcondizionamento è self.size = previous.size - 1poiché l'effetto collaterale contrattuale è la rimozione di un elemento.

E così via …

NB, usato pseudo codice poiché non ha familiarità con OCL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.