软件构造—ADT的理解

最近学习了ADT,即抽象数据类型,刚学的时候理解的不是很好,在完成lab2的过程中,我对ADT的构造以及作用有了一定的理解。(以下仅是我个人理解,很可能会有错误,请批评指正)

ADT的定义:

 首先什么是ADT,它是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的可执行的操作以及这些操作的效果的数学约束(与可能的代价)。

抽象数据类型(ADT)是纯粹理论实体,用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。一个ADT可以用特定数据类型或数据结构实现,在许多程序设计语言中有许多种实现方式;或者用形式规范语言描述。ADT常实现为模块(module):模块的接口声明了对应于ADT操作的例程(procedure),有时用注释描述了约束。

二.  ADT的作用:

根据我的理解,ADT是抽象数据类型,归根结底,它是一种数据类型,只不过是由我们根据我们的需求自己去定义构造出的数据类型。

就像基本数据类型一样,我可以用int i=1去产生一个局部变量i,也可以用我自己构造的Graph去创建一个图变量,例如Graph graph=new Graph(),然后根据我对Graph中方法的实现,可以用graph直接调用实现的方法,例如加点、加边、删除等操作,这样就不需要我再重新在类中实现这些方法。

所以我认为ADT的作用是可以让我们更加方便的去解决很多复杂问题,并且它拥有良好的封装性(前提是构造ADT时要充分考虑到数据的保护),使用的过程很难让人明白它工作的原理,除非去查看源代码,这样就有了很好的安全性。

还是根据Graph去解释,如果我们没有构造这个ADT的话,那么我们如果想要创建一张图的话应该怎么做呢,并且要实现很多的功能,那么我们只能去声明几个集合,比如用list存点、用map存对应点及权值......然后再实现我们需要的功能,去写一个个方法,如果这么去构造的话,是不是有一种非常散乱没有条理的感觉呢,给人的感觉也不好。而如果我们先去构造一个ADT呢,将这些要求都在其中完成,然后我们再去利用这个ADT,那么直接用graph.方法就可以了,那么一个graph就是一张图,是不是感觉整体性很强呢,而且很清晰。

三.  ADT的构造:

要实现:(以茶杯举例,借鉴于学长)

     构造器 : 凭空直接给你造出一个茶杯

生产器 : 放入一个白色的茶杯,与一些颜料,给你返回一个黑色的茶杯

观察器 : 看下茶杯是否为空的,里面的茶叶是什么品种的.

变值器 : 放入一个空茶杯,返回一个打满了茶水的茶杯.改变对象属性的方法,通常返回void,如果返回值为void,则必然意味着它改变了对象的某些内部状态,但变值器也可能返回非空类型如果是不可变类型,则可忽略变值器

四.  ADT的有关概念:

     (重点理解)

     AF(抽象函数):抽象函数描述了对表示的抽象,表示只能说是对一种实际事物的代码层面的抽象,距离数学上的抽象还有一定距离.抽象函数就描述了这段距离是如何行进的.

形式化地描述,AF:R→A,其中R为表示的集合,A为表示的抽象描述的集合.开发者更关注集合R,而客户更关注集合A(事实上他们只能从spec描述的操作得知A).AF一定是一个满射,因为抽象集合中的每个元素都应至少由一种表示实现;AF不一定是单射,可能存在多种表示实际上能被一种抽象所描述;也未必双射,因为不是所有的表示值都能映射到抽象域中

     RI(表示不变量):表示不变量是在任何操作序列执行后表示需要满足的一些条件.最基本的一个表示不变量就是可变/不可变性,它是指该类能否在不创建新对象的情况下改变对象内容的性质.除此之外,ADT还应该定义一些其他的RI,并适时地检查是否符合RI,RI的定义依赖于ADT的性质,例如对集合来说,RI还应该有包含的元素两两不同,对于三角形来说,应该保证边长为正,两边之和大于第三遍,两边之差小于第三边.通常在构造器,生产器,变值器完成其工作并返回之前都应检测是否符合RI.

    其实我认为可以简单的理解为定义域。

表示独立性:我们说一个ADT有良好的表示独立性,就是说客户在使用ADT时不必关心内部表示是怎样的,所有操作的使用方法和效果都在开发者和客户约定的spec中描述清楚,明确规定输入量的约束条件和输出量的形式,并且开发者需要保证在输入正确的情况下输出的正确性和安全性.这就引出了另一个概念:表示泄露,指的是客户通过某些操作(例如调用观察器等)直接得到了ADT的内部表示,这就可能带来一些安全问题.

表示泄露:为了避免表示泄露,使用private,而不用public,根据情况使用final,进行防御性拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值