Lenguaje de restricción de objetos (OCL) para la pila en el paquete java.util


10

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

Si no obtiene ayuda aquí, puede probar el grupo UMLforum en Grupos de Google.
Stephen C

1
O tal vez en StackOverflow :-)
Stephen C

Puede encontrar ejemplos ilustrativos de OCL aquí: www-st.inf.tu-dresden.de/Lehre/WS01-02/fs/slides/fss5a-sl.pdf
Axel Kemper

Respuestas:


1

Las condiciones previas y posteriores son un contrato.

  • La condición previa es la parte del contrato que la persona que llama debe cumplir. Si la condición previa no es, truela función debe arrojar un error.
  • La condición posterior es la parte del contrato que debe cumplir la función y describe el cambio esperado en el objeto / mundo. Si la condición posterior no es, truela 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 popcomo otro ejemplo. Si esta función genera una excepción en una pila vacía, la condición previa es self.size > 0, por otro lado, si la función regresa nilen 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ón self.size = previous.size - 1posterior 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.