您可以将类不变量视为健康标准,必须这样做 由操作之间的所有对象来完成。作为前提条件 因此,可以假设该类的每个公共操作 类不变量持有。另外,它可以假设为a 班级不变的每个公共操作的后置条件 成立。从这个意义上讲,阶级不变量就是一般的 加强前提条件和后提条件 班上的公共运作。有效的前提条件是 与类不变量一起制定前置条件。 同样,有效的后置条件是制定的 后置条件与类不变量一起使用。
public class Server
{
// other code ommited
public Output Foo(Input cmdIn)
{
...
return cmdOut;
}
}
public class Caller
{
// other code ommited
/* calls Server.Foo */
public void Call()
{...}
}
public class Input
{
// other code ommited
public int Length
{...}
}
public class Output
{
// other code ommited
public int Length
{...}
}
1。如果在Server
类上定义类不变:
a)前提条件通常根据被调用操作的形式参数来表示,那么类不变如何加强方法(Foo
) 先决条件
b)后置条件是根据被调用方法的返回值制定的,那么类不变如何加强方法(Foo
's)后置条件?
2。 Caller
课程中定义的类不变式可以加强Foo
的前置条件或者后置
3。如果在Foo
的{{1}}参数中定义类不变:
a)如果cmdIn
上的前置条件表明Foo
在cmdIn.Length
范围内,但类不变量中的一个定义在<{1}}上1-20
指出Input
应该在Input.Length
范围内,然后2-19
的前置条件确实会加强?
b) a)中的逻辑是否有点缺陷,因为如果 class invariant 已经声明Foo
应该在范围{{1}内那么Input.Length
定义前置条件并不总是2-19
(Foo
无法保存值{{}} {1}}或true
)
c)但如果cmdIn.Length
上定义的类不变量表明1
应该在20
范围内,那么Input
的先决条件没有加强?
d)Input.Length
上定义的类不变量能否以某种方式加强0-100
的后置条件?
4。如果在<{1>}的返回值
上定义类不变 a)如果Foo
上的后置条件指出cmdIn
在Foo
范围内,但类不变量中的一个定义了Foo
指出Foo
应该在cmdOut.Length
范围内,然后1-20
的后置条件确实会加强?
b)但如果在Output
上定义的不变量表明Output.Length
应该在2-19
范围内,则Foo
的后置条件不是'加强?
c)Output
上定义的类不变量能否以某种方式加强Output.Length
的前置条件?
5。但我得到的印象是引用的文章意味着仅仅通过拥有类不变(即使这个不变不以任何方式(直接或间接)操作0-100
的参数和/或返回值,它仍会加强Foo
的前提条件和后置条件?如果那是文章实际意味着什么,那怎么可能?
感谢
答案 0 :(得分:2)
a)先决条件通常根据形式来制定 被调用的操作的参数,所以类如何不变 加强方法(Foo)的先决条件?
我怀疑这是你误解的关键。前提条件可能包括正式参数 - 但不限于此。他们可以 - 通常也 - 也可以引用类功能(属性/操作)。通常,不变量和前置条件的组合定义了一组约束,在操作被强制满足其后置条件时必须满足这些约束。类似地,操作必须保证在完成时满足其post条件和任何不变量。以有界缓冲区为例:
Class BoundedBuffer<T> {
public int max // max #items the buffer can hold
public int count // how many items currently in the buffer
void push(T item) {...}
T pop() {...}
}
push()
的前提条件是缓冲区尚未达到其最大大小:
pre: count < max
所以这里的前置条件甚至没有提到操作的形式参数。我们还可以为缓冲区声明一个不变量:
inv: count >=0 //can't have -ve number of elements in the buffer
它强化了前提条件,因为它在push()
操作必须满足其后置条件之前,它必须是真实的。这两个条款在逻辑上是一致的。所以有效的前提条件是count >=0 AND count < max
。这比单独的前置条件更强(更具限制性)约束。
注意,概念不限于前置条件引用类特征的情况。让我们添加一个约束,即添加到缓冲区的任何单个项目的大小必须小于某个上限:
pre: count < max AND item.size() <= MAX_ITEM_SIZE
添加不变量仍然可以增强有效的前提条件:
pre: count < max AND item.size() <= MAX_ITEM_SIZE AND count >=0
总结:在调用操作之前和操作完成之后,不变量必须保持不变。因此他们加强了两者。
- 可以以任何方式在Caller类上定义的类不变量加强Foo的前置条件或后置条件吗?
醇>
没有。不变量仅适用于它们定义的类。
从上面逻辑上回答你剩下的问题。
第h