软件构造 ADT总结

ADT

抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构数学模型;或者具有类似语义的一种或多种程序设计语言数据类型抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。与传统数据类型相比,抽象数据类型更加注重数据上的操作,而不关心数据是怎样存储的,只需要设计和使用即可。

数据类型中的操作

构造器:创造某类型新对象的方法。

构造器可以实现为构造函数或者是静态函数,当构造器是由静态函数实现的时候,我们称其为工厂方法。

例如,String.valueOf()就是一个工厂方法。

生产器:由某类型旧对象创造同类型新对象的方法。

例如String.concat()。

观察器:传入某类型的对象,返回不同类型的对象的方法。

例如List.size()。

变值器:改变对象属性的方法。

变值器通常返回 void,如果返回值为void,则必然意味着它改变了对象的某些内部状态,但是变值器也可能返回非空类型。

例如Set.add()就会返回一个boolean类型来判断是否添加成功。

数据类型的分类

数据类型分为可变类型和不可变类型,可变类型提供了可改变其内部数据值的方法,不可变类型的操作不改变内部值,而是构造新的对象。一般来说不可变类型中是没有变值器的。

测试ADT

由于ADT是由其操作和规约定义的,对ADT的测试也就是对它的方法进行测试判断其是否满足规约。

测试构造器,生产器,变值器:调用观察器来观察这些操作的结果是否满足规约。

测试观察器:调用构造器,生产器,变值器等方法产生或改变对象,来看结果是否正确。

由于上诉的测试是相关联的,那么就存在一定的风险:如果被依赖的测试方法有错误,可能导致被测试方法的测试结果失效。

如何设计一个好的ADT呢?提供一组简洁、一致、全面的操作,设计其行为规约 spec,方便使用。

同时一个好的ADT也应该拥有以下特点:

表示独立性

使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部规约和客户端。例如List究竟是用ArrayList还是LinkedList是ADT内部的事,只要满足规约的情况下,可以随意实现。

不变量和表示暴露

不变量:不变量是一种属性,它在程序运行的时候总是一种状态,而不变性就是其中的一种:一旦一个不可变类型的对象被创建,它总是代表一个不变的值。当一个ADT能够确保它内部的不变量恒定不变(不受使用者/外部影响),我们就说这个ADT保护/保留自己的不变量。

表示暴露:类外部的代码可以直接修改类内部存储的数据。会影响不变性和独立性。 

通常情况下,如果发生表示暴露,那么就很难保证不变量。那么我们该如何避免表示暴露呢?

对于不可变类型的数据来说,private和final修饰符即可保证该变量的值不可变。private表示这个区域只能由同类进行访问,final确保了该变量的索引不会被更改。

但是对于可变类型的数据来说,这还不够,对于可变数据类型来说,final仅能保证其索引不变,但该变量的值依然可能发生变化(发生在类的内部)。我们可以通过防御性复制来弥补这个问题:在返回的时候复制一个新的对象而不会返回原对象的索引。(注意ADT操作中的参数和返回值,如果它们之中有可变类型的对象,确保你的代码没有直接使用索引或者直接返回索引。)

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

抽象空间:用户看到和使用的值构成的空间。

表示空间:ADT开发者具体实现用的值构成的空间。

抽象函数(AF):表示空间到抽象空间之间的一种映射关系,即如何解释R中的每一个值为A中的每一个值。

该映射有如下三个特征:

1.抽象空间中的每一个值在表示空间中都能找到其原像。(必定满射

2.表示空间中多个值可能对应到抽象空间中的一个值。(未必单射

3.表示空间中的值不一定能对应到抽象空间的值。(未必满射

表示不变性(RI):某个具体的“表示”是否是“合法的”。因此需要随时检查RI是否被满足。

不同的内部表示,需要设计不同的AF和RI

总之,一个ADT的实现不仅是选择表示域(规格说明)和抽象域(具体实现),同时也要决定哪一些表示值是合法的(表示不变量),合法表示会被怎么解释/映射(抽象函数)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值