【发布时间】:2025-12-17 07:40:01
【问题描述】:
您可以将类不变量视为健康标准,它必须 由操作之间的所有对象实现。作为前提 对于该类的每个公共操作,因此可以假设 类不变量成立。此外,可以假设为 类不变的每个公共操作的后置条件 持有。在这个意义上,类不变量作为一般 强化前置条件和后置条件 类中的公共操作。有效的前提是 与类不变量一起制定前提条件。 同样,有效的后置条件是 后置条件与类不变量相结合。
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's)前提条件?
b) 后置条件是根据被调用方法的返回值制定的,那么类不变量如何加强方法的(Foo的) 后置条件?
2. 定义在Caller 类上的类不变量 能否以任何方式加强Foo 的前置条件 或后置条件?
3.如果在Foo的cmdIn参数上定义了类不变量:
a) 如果Foo 上的前提条件 表明cmdIn.Length 在1-20 范围内,但Input 上定义的类不变量之一 表明@ 987654334@ 应该在2-19 范围内,那么Foo 的前置条件 确实加强了?
b) a) 中的逻辑是不是有点缺陷,因为如果 class invariant 已经声明 Input.Length 应该在 2-19 范围内,是那么Foo 定义一个并不总是true(cmdIn.Length 不能保存值1 或20)的前提条件 是错误的
c) 但是如果在Input 上定义的类不变量 声明Input.Length 应该在0-100 范围内,那么Foo 的前置条件 是'加强吗?
d) 在cmdIn 上定义的类不变量 是否也能以某种方式加强Foo 的后置条件?
4.如果类不变量定义在Foo的返回值
a) 如果Foo 上的后置条件 表明cmdOut.Length 在1-20 范围内,但Output 上定义的类不变量之一 表明@ 987654355@应该在2-19的范围内,那么Foo的后置条件确实是加强了?
b) 但是如果Output 上定义的不变量声明Output.Length 应该在0-100 范围内,那么Foo 的后置条件 没有加强?
c) 在Output 上定义的类不变量 是否也能以某种方式加强Foo 的前提条件?
5. 但我得到的印象是,引用文章的意思是说,仅通过具有 类不变量(即使这个 不变量不会以任何方式(直接或间接)对Foo 的参数和/或返回值进行操作,它仍会加强Foo 的前置条件 和后置条件?如果这就是文章的实际含义,那怎么可能?
谢谢
【问题讨论】:
标签: domain-driven-design design-by-contract invariants preconditions post-conditions