java.util软件包中用于堆栈的对象约束语言(OCL)


10

我即将参加考试,并且正在查看过去的论文,以期获得一些期望的想法。我对以下内容有些困惑,如果有人可以给出示例答案,我将不胜感激。

在OCL中为以下每个操作(包括在java.util包的Stack类中)写入前置条件和后置条件:

  • (1)布尔型empty()-测试此堆栈是否为空
  • (2)E peek()-在不从堆栈中移除的情况下,查看此堆栈顶部的对象
  • (3)E pop()-删除此堆栈顶部的对象,并将该对象作为此操作的值返回
  • (4)E push(E item)-将一个项目推到此堆栈的顶部

这里E表示堆栈中元素的类型。

我的尝试如下:

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. 

我也不知道我是否应该引用堆栈中的元素。例如:self.elements-> IsEmpty()= true

如果有人可以帮助我,我将非常感激。

编辑

一个朋友有以下想法:

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

如果您在这里没有任何帮助,可以尝试在Google网上论坛中的UMLforum网上论坛。
斯蒂芬·C

1
或者也许在StackOverflow上:-)
Stephen C

您可以在此处找到说明性的OCL示例:www-st.inf.tu-dresden.de/Lehre/WS01-02/fs/slides/fss5a-sl.pdf
Axel Kemper,

Answers:


1

前提条件和后置条件是合同。

  • 前提条件是主叫方必须满足的合同部分。如果前提条件不是true该函数,则必须引发错误。
  • 后置条件是功能必须满足的合同的一部分,并描述了对对象/世界的预期更改。如果后置条件不是,true则实现有错误。

前置条件和后置条件都必须是布尔表达式。

让我们empty?举个例子。始终可以调用此函数,因此没有先决条件。而且该功能没有副作用,因此没有后置条件。

让我们pop再举一个例子。self.size > 0另一方面,如果此函数nil在空堆栈上引发异常,则前提条件为,如果该函数在空堆栈上返回,则不存在前提条件。两者都是有效的设计选择,不熟悉Java的选择。无论哪种情况,后置条件都是self.size = previous.size - 1因为合同的副作用是要删除一个要素。

等等 …

注意,因为不熟悉OCL,所以使用伪代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.