HIT 软构--6 抽象数据类型ADT

本节为课程重点。我们已经学习了数据与操作,将它们复合起来,构成ADT。

ADT的特性:表示泄漏、抽象函数AF、表示不变量RI

一、自定义的数据类型

抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。ADT是有操作定义的,与其内部如何实现无关。

二、对操作和数据进行分类

  • 数据:可变和不可变

对于可变的对象,ADT内部会提供改变其值的操作。而不可变的类型的值不会改变,只会新建一个对象。

  • 操作:构造器creator,生产器producer,观察器observer,变值器mutator

也就是说,构造器通常实现为一个构造函数或静态方法;生产器就是在对构造对象进行操作后,有一个新的对象产生,承接这个操作;观察器只是取走构造对象的一个属性,并不改变对象本身的属性;变值器则是改变了构造对象本身的一个可变类型的属性的值。

e.g. 

三、设计ADT

设计要点:

1.设计简洁、一致的操作

2.要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低
例如list内部的get和size操作

3.要么抽象、要么具体,不要混合

四、表示独立性

表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
该原则旨在确保数据结构的实现与其使用者之间保持松耦合,使得使用者不需要关心数据结构内部的表示方式,而只需要关注其提供的接口和功能。

五、测试ADT的方法

1.针对creator:构造对象之后,用observer去观察是否正确

2.针对observer:用其他三类方法构造对象,然后调用被测observer,判断观察结果是否正确

3.针对producer:produce新对象之后,用observer判断结果是否正确

六、保持不变量

需要尤其注意表示泄露的问题。因为既破坏了表示独立性,即让客户端接触到了本不应泄露的数据,同时也有破坏保持不变量的风险。

方法:防御式拷贝。返回的值是一个新定义的同类型数据,其值克隆原本的数据,但是可以保证数据不被泄露,不能更改。

当然,最好的方式是用immutable的类型,彻底避免表示泄露。

七、Rep Invariant and Abstraction Function

表示空间R:真实表现出的实体

抽象空间A:client看到和使用的值

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

Abstraction Function(AF):RA之间映射关系的函数,即如何去解R中的每一个值为A中的每一个值。

AF是一个未必单射,未必双射,但是满射的映射。也就是说,R中的部分值并非合法的,在A中无映射值

Rep Invariant(RI):某个具体的“表示”是否是“合法的”

方法:选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值