目录
前言
在之前课程的学习中,学习了基本数据类型和对象数据类型。而除了这两种数据类型,还有用户自己定义的数据类型,如抽象数据类型。下面就结合课上所学,来说一下我个人的理解。
1.理解抽象数据类型
抽象数据类型(即ADT)是由程序员自己定义的,不同于编程语言所提供的基本数据类型和对象数据类型的一种数据类型。该数据类型的实现依赖于操作。即对于该数据类型,我们不需要关心其内部具体是如何实现的,而只需要直到该数据类型能进行哪些操作,实现哪些功能即可。
2.操作分类
上面已经介绍了,ADT的实现依赖于操作,而操作可以分为四种类型,即构造器、生产器、观察器和变值器。
2.1构造器
通过构造器,可以实现创建该类型的新对象的操作,也就是实现从无到有的过程。
构造器可以通过构造函数或静态函数来实现,而通过静态方法来实现的构造器一般被叫做工厂。
2.2生产器
生产器可以根据已有的旧的对象创建出新的对象,即实现从有到新的过程。
2.3观察器
观察器通过接受一个抽象数据类型,返回一个其他类型的对象。通常是获得该抽象数据类型的某个属性。
2.4变值器
变值器可以改变ADT对象。
3.ADT的设计
要设计一个好的ADT,要选择好其所包含的操作。设计的过程中要遵循以下原则。
- 设计简洁、一致的操作。设计的操作要尽量简单,通过简单的操作来实现复杂的操作。
- 满足所有操作需求,且操作难度低。要使得对象所有属性都可以被访问到。
- 抽象和具体不能混用。要么面向具体应用,要么面向通用类型。
4.表示独立性
表示独立性是指,用户在使用ADT时不需要知道其内部是如何实现的,只需要通过规约和前置后置条件知道如何使用ADT即可。而当ADT内部的实现发生变化时,不会对外部的实现产生任何影响,这样在对ADT进行更改时将更加的方便且安全。
5.不变量
不变量是ADT中所具有的属性,在任何时候都是true的,ADT要始终保持不变量,确保其正确。
可以通过使用final关键字来使得创建对象后其不可变类型数据不会被重新分配。也可用private或public关键字来说明哪些类是能从外部访问,哪些只能内部访问。
此外,还可以通过返回一个复制的副本来增强安全性,避免表示泄露。
6.AF和RI
6.1AF(Abstraction Function)
首先来介绍两个空间的概念,即表示空间和抽象空间。
表示空间R为标示值,有ADT内实际的实现的值组成,这个空间是开发者来使用的,开发者可见。
抽象空间A为ADT设计所要实现操作的值组成,用户只能看到和使用该空间。
而AF即为由R到A的映射关系,该映射为满射,但未必为单射或双射。
6.2RI(Rep Invariant)
RI是用来判断某个表示是否是符合规范的。RI描述了什么样的表示才是合法的,其是一个包含了所有合法表示的集合。
总结
合理的利用ADT对编程有着很大的帮助,同时对于我们所实现的客户端的安全性将会有这很大的帮助。用户只能进行相关的操作,却无法得知其内部是如何实现的。
一个ADT的设计要从如下三方面入手:
- 设计选择R和A
- 确定RI
- 确定映射关系AF