ADT抽象数据类型

本文探讨了抽象数据类型(ADT)的概念,强调了ADT与表示的独立性,允许数据结构和操作方式的分离。ADT包括不变量、可变和不可变数据类型的角色,以及构造器、生产器和变值器等操作。不变量是确保ADT正确性的关键属性,而表示独立性确保内部实现变化不会影响外部接口。此外,讨论了工厂方法、防御式拷贝和不可变视图在维护ADT不变量中的作用。最后,提到了如何使用ADT不变量取代复杂的前置条件,简化程序设计。
摘要由CSDN通过智能技术生成

一.ADT:抽象数据类型

1.除了编程语言所提供的基本数据类型和对象数据类型,程序员可定义自己的数据类型

2.抽象数据类型被其操作定义,操作和规约刻画其特征

3.抽象数据类型与表示独立性:能够分离数据结构和对其使用的方式

4.ADT特性:不变量、表示泄露、抽象函数AF、表示不变量RI

二.可变和不可变数据类型

1.可变类型的对象:提供了可改变其内部数据的值的操作

2.不可变数据类型:其操作不可改变内部值

3.抽象类型的操作:

构造器(从无到有),构造器可能需要一个对象参数,但这个参数类型不是要构造的类型

生产器(从有到新),

变值器:改变对象属性的方法,变值器通常返回void,也可能返回非空类型,如set.add() returns boolean

观察器:用一个ADT 对象,返回一个不同类型的对象

构造器:可能实现为构造函数或静态函数

4. 工厂方法:实现为静态方法的构造器

三、表示独立性

1.表示独立性:client使用ADT时无需考虑其内部如如何实现,ADT内部表示的变化不应该影响外部spec和客户端

2./**和*/之间的内容以及方法或类的签名是spec,类的域是rep,方法内部的代码时impl

四、不变量

1.ADT需要始终保持其不变量

2.不变量:程序中在任何时刻总是正确的属性

3.保持程序的不变量可以容易发现错误

4.表示泄露:不仅影响不变量,也影响表示独立性:无法在不影响客户端的情况下改变其内部表示

5.关键字:private: 域和方法只能在类中使用,

                  public:域和方法可以在类外使用

                  final:引用不可变

6.返回可变域的防御式拷贝,或者可变域的不可变view

五、RI和AF

1.R:表示值构成的空间:实现者看到和使用的值

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

2.R和A之间的映射关系R->A:

满射:实现抽象类的目的就是为了支持对抽象值的操作,所以每个可能的抽象值都要被实现在R中

未必单射,A中一个东西未必只有一个R中表示

未必双射。

3.AF:R和A之间映射关系的函数,即如何将R中的每一个值解释为A中的每一个值(R中部分值非法,在A中无映射)

4.RI(Rep Invariant): 是一个从R到 boolean值的映射。

可以理解为一个条件,描述了什么是“合法”的表示值、

5.check RI:在实现中插入checkRep()。在所有可能改变rep的方法内部都要检查。observer方法不必,但建议也查查

六、有益的可变性 :

1.mutation只是改变了R值,并未改变A值

immutable的类中不可以随意出现mutator

 

七、documenting

1.ADT的规约:只能使用client可见的内容来撰写,包括参数,返回值,异常等,如果规约里需要提及值,只能使用A空间中的值。

2.代码中以注释的形式写出AF和RI而不能在javadoc文档中,防止被外部看到而破坏其表示独立性。

 

 

八、ADT invariant取代前置条件

1.用ADT不变量取代复杂的前置条件,相当于将复杂的前置条件封装到了ADT内部。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值