- 理解待决定(underdetermined)规格说明,并能够辨别评估待决定的规格说明。
- 理解声明性的规格说明和操作性的规格说明之间的区别,并能够写出声明性的规格说明。
- 理解前置条件、后置条件、及规格说明的“强度”,并能够比较两个规格说明之间的强度。
- 能够写出逻辑严密、前后连贯的规格说明。
- 不变量(invariants)
- 表示暴露(representation exposure)
- 抽象函数(abstraction functions)
- 表示不变量(representation invariants)
不变量
回想我们之前讨论过的关于ADT的内容,什么设计会产生好的ADT中最重要的一点就是它会保护/保留自己的不变量。 不变量是一种属性,它在程序运行的时候总是一种状态,而不变性就是其中的一种:一旦一个不变类型的对象被创建,它总是代表一个不变的值。当一个ADT能够确保它内部的不变量恒定不变(不受使用者/外部影响),我们就说这个ADT保护/保留自己的不变量.
当一个ADT保护/保留自己的不变量时,对代码的分析会变得更简单。例如,你能够依赖字符串不变性的特点,在分析的时候跳过那些关于字符串的代码;或者当你尝试基于字符串建立其他的不变量的时候,也会变得更简单。与此相对,对于可变的对象,你将不得不对每一处使用它的代码处进行审查。
可变类型的不可变包装
Java的collections类提供了一种有趣的“折中”:不可变包装。
会接收一个(可变)然后将其包装为一个不可变对象——它的 , , ,等操作都会抛出异常。所以你可以将一个包装为不可变对象(记得将以前对于的索引丢掉),然后将它传入其他地方使用。
这种方法的缺点就是你只能在运行时获得不可变性,而不是编译时。Java不会在编译的时候对你对“不可变”列表的修改提出警告。但是这总比什么都不做好,所以使用不可变的列表、映射、和集合也是减少bug的好方法。
表示不变量和抽象函数
我们现在深入理解一下抽象数据类型背后的理论,这些理论不仅本身很有趣,它们在ADT的设计与实现中也很有意义。如果你能够很好的理解它们,你将会设计出更好的抽象类型,并且远离那些隐晦的陷阱。
在研究抽象类型的时候,先思考一下两个值域之间的关系:
表示域(space of representation values)里面包含的是值具体的实现实体。在简单的情况下,一个抽象类型只需要实现为单个的对象,但是更常见的情况是使用一个很多对象的 络。
抽象域里面包含的则是类型设计时支持使用的值。这些值是由表示域“抽象/想象”出来的,也是使用者关注的。例如,一个无限整数对象的抽象域是整个整数域,但是它的实现域可能是一个由原始整数类型(有限)组成的数组实现的,而使用者只关注抽象域。
但是,实现者是非常“在意”表示域(和抽象域)的,因为实现者的责任就是实现表示域到抽象域的转换(映射)。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91513 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!