Tengo un examen por delante y estoy mirando trabajos anteriores para tener algunas ideas de qué esperar. Estoy un poco atascado en el siguiente y realmente agradecería si alguien pudiera dar algunas respuestas de ejemplo.
Escriba precondiciones y postcondiciones en OCL para cada una de las siguientes operaciones (incluidas en la clase Stack en el paquete java.util):
- (1) Boolean empty (): prueba si esta pila está vacía
- (2) E peek () - Mira el objeto en la parte superior de esta pila sin quitarlo de la pila
- (3) E pop (): elimina el objeto en la parte superior de esta pila y devuelve ese objeto como el valor de esta operación
- (4) Empujar E (objeto E): empuja un objeto a la parte superior de esta pila
Aquí E denota el tipo de elementos en la pila.
Mis intentos son los siguientes:
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.
Tampoco sé si debería hacer referencia a los elementos en la pila. Por ejemplo: self.elements -> IsEmpty () = true
Si alguien pudiera ayudarme, realmente lo agradecería.
EDITAR
Un amigo tiene las siguientes ideas:
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
Respuestas:
Las condiciones previas y posteriores son un contrato.
true
la función debe arrojar un error.true
la implementación tiene un error.Tanto la condición previa como la posterior deben ser expresiones booleanas.
Tomemos
empty?
como ejemplo. Esta función siempre se puede llamar, por lo que no hay condición previa. Y la función no tiene efectos secundarios, por lo que no hay condición posterior.Tomemos
pop
como otro ejemplo. Si esta función genera una excepción en una pila vacía, la condición previa esself.size > 0
, por otro lado, si la función regresanil
en una pila vacía, no hay condición previa. Ambas son elecciones de diseño válidas, no familiarizadas con la elección de Java. En cualquier caso, la condiciónself.size = previous.size - 1
posterior se debe a que el efecto secundario contractual es eliminar un elemento.Y así …
NB, usó pseudocódigo ya que no está familiarizado con OCL.
fuente