链接
您可以将类不变量视为健康标准,它必须由操作之间的所有对象来实现。作为先决条件因此,对于类的每一个公共操作,都可以假定类不变量成立。此外,它可以假设为类不变量的每个公共操作的后条件持有。在这个意义上,类不变量充当一般加强课堂上的公共操作。有效的前提条件是结合类不变量的公式化前提条件。同样,有效的后条件是后置条件与类不变量结合使用。
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( 预条件通常是根据被调用操作的形式参数来制定的,那么类不变量如何加强方法( b( 后置条件是根据被调用方法的返回值来制定的,那么类不变量如何增强方法( 2.在 3.如果类不变量是在 a( 如果 b( a(中的逻辑是不是有点缺陷,因为如果类不变量已经声明 c( 但是,如果在 d( 4.如果类不变量定义在 a( 如果 b( 但如果定义在 c( 在 5.但我的印象是,引用的文章的意思是,只要有一个类不变量(即使这个不变量决条件和后决条件?如果这就是文章的真正含义,那怎么可能呢? 感谢Foo
’s(的先决条件Foo
(的postconditions?Caller
类上定义的类不变量是否可以以任何方式增强Foo
的preconditions或后条件?Foo
的cmdIn
参数上定义的:Foo
上的前提条件声明cmdIn.Length
在范围1-20
内,但Input
上定义的class不变量之一声明Input.Length
应该在范围2-19
内,那么Foo
的1前提条件确实被强化了?Input.Length
应该在范围2-19
内,那么Foo
定义一个不总是true
的前提条件不是错误的吗(cmdIn.Length
不能保持值1
或20
(Input
上定义的类不变量声明Input.Length
应该在0-100
的范围内,那么Foo
的precondition不是加强的?cmdIn
上定义的类不变量是否也能以某种方式加强Foo
的postcondition?Foo
的返回值上Foo
上的后条件声明cmdOut.Length
在范围1-20
内,但在Output
上定义的class不变量之一声明Output.Length
应该在范围2-19
内,那么Foo
的<em]后条件>确实是加强的?Output
上的不变量表明Output.Length
应该在0-100
的范围内,那么Foo
的后条件就没有增强?Output
上定义的类不变量是否也能以某种方式加强Foo
的precondition?
a( 先决条件通常是根据形式被调用操作的参数,那么类如何保持不变强化方法的前提条件?
我怀疑这是你误解的关键。先决条件可能包括正式参数,但不限于这些参数。它们也可以——而且经常这样做——也指类特性(属性/操作(。通常,不变量和前置条件的组合定义了一组约束,这些约束必须在操作被调用时满足其后置条件之前得到满足。类似地,一个操作必须保证它的后条件和任何不变量在完成时都会得到满足。以有界缓冲区为例:
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的前置条件或后置条件吗
没有。不变量仅应用于定义它们的类。
你剩下的问题的答案从上面按逻辑排列。
hth。