软件构造——不变量相关知识点

本文探讨了不可变数据结构(ADT)的特点,包括表示独立性、表示泄露问题,以及如何通过使用final和private保护内部表示并确保不变量。文章强调了抽象函数(AF)的重要性,展示了不同的解释映射可能带来的变化,并提倡在方法中检查不变量和使用观察者模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

immutable的ADT具有不少特性。

表示独立性:

client使用ADT无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端,除非ADT的操作指明了具体的前置条件和后置条件,否则不能改变ADT的内部表示。

表示泄露:

不仅影响不变性,也影响了表示独立性,无法在不影响客户端的情况下改变其内部表示。最好的办法:使用immutable的类型并且将其声明为(privat final),彻底避免表示泄露,此外还可以使用防御式拷贝。

不变量、表示不变量RI:

由ADT来负责其不变量,与client端的任何行为无关。

RI:R→boolean,某个具体的表示是否是合法的,是所有表示值的一个子集,也包含了所有合法的表示值,一个条件,描述了什么是合法的表示值:

表示空间、抽象空间AF:

ADT开发者关注表示空间R,client关注抽象空间A。

抽象函数:R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。

AF:满射,非单射,未必双射,可知R中的部分值并非合法,在A中无映射。

即使是同样的R,同样的RI,也可能有不同的AF,即解释不同。

例如:

随时检查RI是否满足:在所有可能改变rep的方法内部都要检查。

Observer方法可以不用,但建议也要,防止万一。

要精确记录RI:rep中的所有fileds何为有效。

要精确记录AF:如何解释每一个R值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值