很简单,在设计一个新课时,我该如何计算出不变量应该是什么?什么定义了不变量?我听说它与有效性有关,但这仍然是模棱两可的。什么使给定的实例有效或无效是有争议的。
我应该选择“肠道”的感觉吗?是否有指导方针来确定不变量是什么?
答案 0 :(得分:2)
Invariant始终表示为谓词,参数是类的一些或所有状态变量(字段)。一个班级可以有一个以上的不变量。例如,假设您有一个Account
类,其中包含initialBalance
,listOfTransactions
,currentBalance
。此外,我们将事务保存在排序(按日期)列表中。对于此类,至少应保留两个不变量:
1)initialBalance + sum(交易金额)= currentBalance
2)对于listOfTransactions中的每个元素,位置timestamp
处的i
应始终小于位置timestamp
处的j
i < j
class
}}
不变量取决于closedDate
正在做什么以及如何实现类。
假设我们可以再添加一个状态变量:Ellipse
,还会出现一个不变量:没有事务可以在closeDate之后有日期。
或者如果列表没有按日期排序,而是按交易金额排序,那么保密人就会改变。
另一个例子:
假设您使用两个字段r1
和r2
定义了可变 r1
类,其中包含r2
和Circle
的设置器。此类没有任何不变量,因为r1和r2的任何值都可以表示定义明确的椭圆。
现在让我们假设您创建了扩展可变Ellipse
的新Ellipse
类。圆圈只有一个半径加上不变量(r1 == r2)。为了保持不变量,你必须禁止某人设置r1或r2,这样r1!= r2就会发生。
另一方面,如果Circle
和{{1}} 不可变,您不必在对象的生命周期中关注不变量,因为条件会只在施工期间进行检查。
通过前面的例子,我想解释一下
1)不变量的建立和维护方式在很大程度上取决于类的关系 design 的选择。
2)班级在做什么
3)如何实施课程。
不可变的类往往不那么复杂,以维持它们的不变性,因为它们是在构造时建立的,并且永远不会改变。 (不变性还有许多其他好处 - 不在答案的范围内)