软构笔记——第6章ADT

1. 抽象数据类型和表示独立性

学习目标:如何设计良好的抽象数据结构
                 ~~~~~~~~~~~~~~~~                 学会通过封装避免客户端获取数据的内部表示等

2.User-Defined Types 用户自定义的数据类型

(1) 用户定义的只能是class对象数据类型
(2) 要求数据抽象:由一组操作所刻画的数据类型,而抽象数据型是由操作定义的,暴露给用户的只能是一堆方法。
(3) ** 操作类型 **
creator:构造器 其他类型->当前类型
producer:生产器 当前类型->当前类型
observer:观察器 当前类型->其他类型
mutator:变值器 改变对象属性的方法(当前类型对值进行改变)
可变和不可变数据类型的区别是类中是否有变值器,但是其实不可变数据类型也可以有变值器,只要不改变暴露给用户的属性就可以。
考试给操作问属于哪个类型
变值器通常返回void,如果返回void必然意味着它改变了对象的某些内部状态,也可以返回非空,比如返回boolean类型

3.ADT类型

4.设计ADT

** 设计方法**
(1)简洁一致,一个方法一件事
(2)足够client用,且用操作满足client需要的难度要低

5.表示独立性

(1)只能用类提供的方法改变类中的属性值
(2)ADT内部表示的变化不影响外部和客户端
(3)防止表示暴露的方法
         ~~~~~~~~         mutable类型的对象return时候,不要把mutable类型引用直接返回过去,如果直接返回的话,会使用户获得引用直接改变值,发生表示暴露
         ~~~~~~~~         属性选择private

6.test ADT

(1) 四类方法中只有observers可以直接测试。
(2) 测试creators、producers和mutators调用observers观察是否满足spec
(3) 测试observers也可以调用creators,producers,mutators等方法产生或改变对象来看结果是否匹配
:如果被依赖的其他方法有错误可能导致被测试的方法的测试结果失败

7.invariants 保持不变量

不变量 :一个规则,任何时候都正确,都不能违反
比如:immutability就是一个典型的不变量,表示独立性也是不变量(用户使用类的时候只操作看不到属性,只能通过提供的方法改变属性)

8.设计ADT表示

程序员看到的是R空间用户看到的是A空间,要做的是建立一个AF映射。(AF:abstraction function)

映射要求
(1)满射,A中值在R中都可以找到对应值
(2)未必单射,R中可多个对应到同一个A中值,但设计时尽量不要未必单射不好判相等
(3)未必双射,R中某些不必映射到A,R中不符合要求的值,**一般R多于A)

设计ADT
(1)选择R和A
(2)明确RI,合法表示值
(3)如何解释合法的表示值——AF映射

随时检查RI是否满足
在所有可能改变属性(rep)的方法后检测(checkRep()),好的设计程序是在写错了时就马上报错而非用的时候才报错,observer方法可不用但建议加上

9.Beneficent mutation 有益的改变

AF和RI的设计会影响到具体方法的设计

10.Documenting the AF,RI,and safety from Rep Exposure

(1)在代码中用注释形式记录AF和RI
(2)List Set Map不要直接返回而是通过collection执行的操作弄成immutable再返回
(3)ADT的规约:只能用用户可见的内容来写,只能用A空间的不能用R空间的描述值
注意:规约还包含方法声明,而方法声明是可以被编译器静态检测的
(4)表示不变量要一直保持着true
(5)所有方法都不能违背RI
(6)所有方法都不能表示暴露

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值