0

很简单,在设计一个新类时,我如何确定不变量应该是什么?什么定义了不变量?我听说它与有效性有关,但这仍然模棱两可。使给定实例有效或无效的原因是有争议的。

我应该只凭我的“直觉”感觉吗?是否有确定不变量是什么的指导方针?

4

1 回答 1

2

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

1) initialBalance + sum(transaction amount) = currentBalance
2) 对于 listOfTransactions 中的每个元素,timestamp位置的交易的i应该总是小于timestamp位置的交易的jif i < j

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

比方说,我们可以再添加一个状态变量:closedDate,并且会出现一个不变量:没有交易可以在closeDate之后有日期。

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

另一个例子:
假设你有一个定义了两个字段的可变 Ellipse类,r1并且r2它有用于r1和的设置器r2。此类没有任何不变量,因为 r1 和 r2 的任何值都可以表示定义明确的椭圆。

现在让我们假设您创建Circle了扩展 mutable 的新类Ellipse。圆只有一个半径加上不变量是(r1==r2)。为了保持不变性,您必须禁止有人设置 r1 或 r2,这样 r1!=r2 就会发生。

另一方面,如果EllipseCircle不可变的,则您不必在对象的生命周期内关心不变量,因为仅在构造期间会检查条件。

对于前面的例子,我想解释一下
1) 不变量的建立和维护方式很大程度上取决于类之间关系的设计选择。
2)类在做什么
3)类是如何实现的。

不可变类在保持其不变性方面往往不太复杂,因为它们是在构造时建立的,并且永远不会改变。(不变性也有许多其他好处——不在答案的范围内)

于 2011-07-18T02:57:04.083 回答