2011-07-18 37 views
0

很简单,当设计一个新班级时,我该如何弄清楚不变量应该是什么?什么定义了不变量?我听说它与有效性有关,但这仍然不明确。是什么让一个给定的实例有效或无效是有争议的。如何确定不变量是什么?

我应该用我的“直觉”去感受吗?是否有指导方法来确定不变量是什么?

+0

我不认为有一个* *不变量 - 根据您设计的方式需要保持一致:这些是不变量。 – Owen

回答

2

不变可以始终表示为谓词,参数是类的一些或全部状态变量(字段)。一个类可以有更多的一个不变量。例如,假设您有一个Account类,它具有initialBalance,listOfTransactions,currentBalance。此外,我们将交易保存在排序的(按日期)列表中。对于这个类有一些应保持在至少两个不变量:

1)initialBalance + SUM(交易金额)= currentBalance
2),用于在listOfTransactions每个元素,交易时i位置timestamp应如果i < j始终小于位置j处的交易的timestamp

不变量取决于class正在做什么以及该类如何实现。

假设我们可以再添加一个状态变量:closedDate,还会出现一个不变量:closeDate后没有事务可以有日期。

或者如果列表不是按日期排序,而是按交易金额排序,那么侵略者会改变。

又如:
让我们假设你有两个字段,r1r2这对于r1r2制定者定义可变Ellipse类。这个类没有任何不变性,因为r1和r2的任何值都可以表示定义良好的椭圆。

现在让我们假设您创建了新的Circle类,它扩展了可变的Ellipse。 (r1 == r2)。为了保持不变,必须禁止某人设置r1或r2,从而发生r1!= r2。

在另一方面,如果EllipseCircle不变你不必关心对象的生命过程中的不变量,视病情只会在施工期间进行检查。

随着前面的例子中,我想说明的是
1)不变量建立和维护的方式在很大程度上取决于中的类之间的关系设计的选择。
2)班上正在做什么
3)该班是如何实施的。

不可变为了保持它们的不变性,它们往往不那么复杂,因为它们在施工时就已经建立起来了,而且从不改变。(不变性还有许多其他的好处 - 不在答案的范围内)

+1

我想说,从Ellipse派生'Circle'违反了LSP。它与方形/矩形问题相同。 – Maxpm

+0

如果它们是不可变的,它不会违反LSP,因为没有人可以改变状态。如果可变,它会。 –