Eu tenho um exame chegando e eu estou olhando documentos anteriores para ter algumas idéias do que esperar. Estou um pouco preso no seguinte e realmente apreciaria se alguém pudesse dar algumas respostas de exemplo.
Escreva pré-condições e pós-condições no OCL para cada uma das seguintes operações (incluídas na classe Stack no pacote java.util):
- (1) Boolean empty () - Testa se esta pilha está vazia
- (2) E peek () - Olha o objeto no topo desta pilha sem removê-la da pilha
- (3) E pop () - remove o objeto no topo desta pilha e retorna esse objeto como o valor desta operação
- (4) E push (item E) - empurra um item para o topo desta pilha
Aqui E denota o tipo de elementos na pilha.
Minhas tentativas são as seguintes:
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.
Também não sei se devo referenciar os elementos na pilha. Por exemplo: self.elements -> IsEmpty () = true
Se alguém pudesse me ajudar, eu realmente aprecio isso.
EDITAR
Um amigo tem as seguintes idéias:
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
Respostas:
Pré e pós-condições são um contrato.
true
a função deve gerar um erro.true
a implementação possui um erro.As condições pré e pós-condição devem ser expressões booleanas.
Vamos dar
empty?
como exemplo. Essa função sempre pode ser chamada, portanto, não há pré-condição. E a função não tem efeito colateral, portanto não há pós-condição.Vamos tomar
pop
como outro exemplo. Se essa função gerar uma exceção em uma pilha vazia, a pré-condição seráself.size > 0
, por outro lado, se a função retornarnil
em uma pilha vazia, não haverá pré-condição. Ambos são opções de design válidas, não familiarizadas com a escolha de Java. Nos dois casos, a pós-condição ocorreself.size = previous.size - 1
porque o efeito colateral contratual é remover um elemento.E assim por diante …
NB, usava pseudo-código, pois não estava familiarizado com a OCL.
fonte