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

10

Ho un esame in corso e sto guardando i documenti del passato per avere qualche idea su cosa aspettarsi. Sono un po 'bloccato sul seguente e apprezzerei davvero 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 nella parte superiore di questo stack senza rimuovere dallo stack
  • (3) E pop () - Rimuove l'oggetto nella parte superiore di questo stack e restituisce quell'oggetto come valore di questa operazione
  • (4) E spingere (elemento E) - spinge un oggetto nella parte superiore di questo gruppo

Qui E indica il tipo di elementi nello stack.

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.

EDIT

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
    
posta Aimee Jones 12.05.2013 - 01:20
fonte

1 risposta

1

Le pre e postcondizioni sono un contratto.

  • La precondizione è la parte del contratto che il chiamante deve soddisfare. Se la precondizione non è true , la funzione deve generare un errore.
  • La post-condizione è la parte del contratto che deve essere soddisfatta dalla funzione e descrive il cambiamento previsto per l'oggetto / mondo. Se la post-condizione non è true l'implementazione ha un bug.

Sia pre e post-condizionali devono essere espressioni booleane.

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

Prendiamo pop come altro esempio. Se questa funzione solleva un'eccezione su uno stack vuoto, la precondizione è self.size > 0 , d'altra parte, se la funzione restituisce nil su uno stack vuoto, non vi è alcuna condizione preliminare. Entrambe sono valide scelte progettuali, non familiari con la scelta di Java. In entrambi i casi la post-condizione è self.size = previous.size - 1 poiché l'effetto collaterale contrattuale è quello di rimuovere un elemento.

E così via ...

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

    
risposta data 23.12.2016 - 20:20
fonte

Leggi altre domande sui tag