我如何确定不变量是什么?

时间:2011-07-18 02:09:56

标签: oop language-agnostic invariants

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

我应该选择“肠道”的感觉吗?是否有指导方针来确定不变量是什么?

1 个答案:

答案 0 :(得分:2)

Invariant始终表示为谓词,参数是类的一些或所有状态变量(字段)。一个班级可以有一个以上的不变量。例如,假设您有一个Account类,其中包含initialBalancelistOfTransactionscurrentBalance。此外,我们将事务保存在排序(按日期)列表中。对于此类,至少应保留两个不变量:

1)initialBalance + sum(交易金额)= currentBalance
   2)对于listOfTransactions中的每个元素,位置timestamp处的i应始终小于位置timestamp处的j i < j class }}

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

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

或者如果列表没有按日期排序,而是按交易金额排序,那么保密人就会改变。

另一个例子:
假设您使用两个字段r1r2定义了可变 r1类,其中包含r2Circle的设置器。此类没有任何不变量,因为r1和r2的任何值都可以表示定义明确的椭圆。

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

另一方面,如果Circle和{{1}} 不可变,您不必在对象的生命周期中关注不变量,因为条件会只在施工期间进行检查。

通过前面的例子,我想解释一下 1)不变量的建立和维护方式在很大程度上取决于类的关系 design 的选择。
2)班级在做什么 3)如何实施课程。

不可变的类往往不那么复杂,以维持它们的不变性,因为它们是在构造时建立的,并且永远不会改变。 (不变性还有许多其他好处 - 不在答案的范围内)