抽象数据类型与表示独立性

1.抽象类型 1.传统类型定义关注数据的具体表示,而抽象类型强调“作用于数据上的操作”,程序员和用户端无需关心数据如何具体存储的,只需设计/使用操作即可。 2.抽象类型是不透明的,具体实现不可见,而是用操作和规约刻画类型特征

2.数据类型与操作的分类 1.数据类型分类:可变与不可变数据类型 可变数据类型:提供了可改变其内部数据的值的操作 不可变数据类型: 其操作不可改变内部值,而是构造新的对象。 关于可变性与不可变性的详细区分已经在Part 1中介绍,这里不再阐述 2.操作的分类:构造器(从无到有)、 生产器(从旧到新)、观察器、变值器 ①构造器:顾名思义,创建一个该类型的新对象,方法可以由参数,也可以没有参数,如构造方法。但需要注意的是,如果构造器有参数,那么参数一定不能是本类型的对象,因为构造器本身是从无到有的构造,是一个全新的构造,直接利用已有对象产生的新对象属于生产器的范畴。构造器包括构造函数和静态函数等。 ②生产器:从已有的原对象中产生新的对象,如String中的concat方法 ③观察器:返回对象的某些属性值,不会对其进行修改。如List中的size方法 ④变值器:改变对象的属性,只有可变数据类型才拥有,如List中的add方法。变值器通常返回void,此时说明它一定改变了对象的某些内部属性;当然,变值器的返回值也可能为非void类型,此时不一定改变了对象的属性

3.设计ADT的原则 1.设计简洁、一致的操作。 通过简单操作的组合实现复杂的操作。操作的行为应该 是内聚的。 2.要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低。 用来判断这一标准的方法:对象每个需要被访问到的属性是否都能够被访问到 3.要么抽象、要么具体,不要混合 — 要么针对抽象设计,要么针对具体应用的设计。面向具体应用的类型不应包含通用方法,面向通用的类型不应包含面向具体应用的方法。

4 Designing an Abstract Type 设计简洁、一致的操作

要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低

5 Representation Independence 表示独立性 表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。 除非ADT的操作指明了具体的pre- 和post-condition,否则不能改变ADT的内部表示——spec规定了client和implementer之间的契约。client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部规约和客户端。之前在Part 1中介绍了规约的作用,规约隔离了client和方法,通过前提条件和后置条件充分刻画了ADT的操作,规约规定了client和开发人员之间的契约。因此client知道可以依赖哪些内容,开发人员知道可以安全更改哪些内容。client可以依赖的是public的成员属性以及方法,并且对于他们的了解都是满足规约前置条件的。 开发人员可以在满足规约前提下安全地更改这些属性以及方法,实现对变化的“隔离”

6 Testing an Abstract Data Type 测试creators, producers, and mutators:调用observers来观察这些operations的结果是否满足spec; 测试observers:调用creators, producers, and mutators等方法产生或改变对象,来看结果是否正确。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值