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