哈工大软件构造第六章总结

第六章主要介绍了抽象数据类型和表示独立性,将数据和操作结合起来,构成一个完整的应用对象,并介绍了ADT的核心特征和编写一个好的ADT的方法。

(一)抽象与自定义类型

数据抽象是由一组操作刻画的数据类型,因此程序员与用户再面对抽象类型时不需要注意数据的储存方式,只要设计和使用操作即可。即抽象数据类型ADT是由操作定义的,与内部实现无关。

(二)类型与方法的分类

类型可分为可变和不可变类型,可变类型会提供改变内部值的操作,不可变类型则没有此类方法,但可以构造新的对象。

对抽象类型的操作则可以分为四种:构造器creator、生产器producer(从已有生成新的对象,比如连接两个字符串)、观察器observer和变值器mutator(一般返回void,此时意味着必然改变了某些值,也可返回其他信息)

(三)ADT抽象数据类型

如int,String,List。

设计良好的ADT,需要设计一组简单操作,用这些简单操作的组合来实现复杂的操作,操作的行为应该是内聚的;需要满足用户所有操作需求,且满足难度尽量低;需要分割抽象和具体设计,要么针对抽象设计,要么针对具体应用设计。

(四)表示独立性

表示独立性值用户使用ADT时不需要考虑内部实现,ADT内部变化不影响外部规约与客户端。表示独立性的实现要借助前置条件和后置条件的充分性来明确用户以来的内容和开发者可以安全更改的范围。

(五)针对ADT的测试

对于构造器、生产器和变值器:调用观察器来查看结果与规约关系

对于观察器:调用构造器、生产器和变值器等产生或改变对象,来让观察器结果和预期结果作比较。

但在这种测试方法中,如果被依赖的方法有问题,则测试结果就没有保障。

(六)不变量Invariants

不变量是指程序中任何时候都是true的性质,比如一个immutability变量,一旦创建后永远保持同样的值。不变量应由ADT负责,与客户端行为无关。通过不变量来保证程序正确性,比如如果一个String发生了改变,那一定有方法出现了bug。

表示泄露则是指class外部的代码可以直接改变表示量的值,这同时影响了不变量和表示独立性,无法在不影响客户的情况下改变内部表示。

要保护好不变量,就要尽可能使用private和final修饰变量,从而防止外部的修改。当然也可以再spec中向用户声明不要修改某些属性,但这一般只在复制代价较高时才会如此。

(七)表示不变量RI与抽象函数AF

表示空间R为表示值构成的空间,为实现者看到和使用的值;二抽象空间A是抽象值构成的空间,为客户端看到和使用的值。AF为从R到A的满射,指开发者看到的一个量再客户端眼中的样子,即如何将R中每个值解释为A中的每个值。

RI则为R的一个子集,包含所有合法的表示值,RI之外的值在A中无映射。RI也可以看作是一个条件,描述什么样的值是合法的。但相同的R与RI也可能有不同的AF。

例子:

因此,设计ADT时,要选择好R与A,写出合法表示值RI、对合法表示值的解释AF,并作出具体的解释。

另外,在代码中也要随时检查RI是否满足,一般用一个私有方法checkRep,没有输入与输出,通过assert来检查RI,并在所有可能改变rep的地方调用。

 (八)有益的可变性

只改变R而不改变A时,对客户端来说时指AF不是单射,这是允许的,有些时候反而会简化输出结果,但不可变类中仍然不能随意出现mutator。

(九)记录AF、RI和表示泄露安全

以注释形式记录(否则在javadoc文档中AF和RI会被外界看到而发生泄漏)。RI:rep的域中何为有效;AF:如何解释每一个R值;安全声明:代码没有表示泄露的理由。

在编写记录时,只能用客户端可见的内容来编写,包括参数,返回值,异常等。如果规约中需要“值”,那只能使用A空间中的值。在ADT的规约中也不能提到任何内部细节,包括R空间的所有制,其私有属性应对外界严格不可见。

要确保不变量,需要保证对象的初始状态时不变量为真,对象发生变化时不变量也为真。四种方法保证不变性且每个方法return之前用checkRep检查。

(十)以不变量代替前置条件

相当于将复杂的前置条件封装到了ADT内部。如:

-> 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值