首页 > 技术文章 > 3.3Abstract Data Type (ADT)抽象数据类型

qq1076150459 2020-07-11 19:32 原文

CONTENTS
1.Abstraction and User-Defined Types抽象和用户定义类型

2.Classification of operations in ADT抽象数据类型的分类

3.Abstract Data Type Examples抽象数据类型的范例

4.Design principles of ADT抽象数据类型的设计原则

5.Representation Independence (RI)

6.Realizing ADT Concepts in Java   JAVA中的抽象数据类型的概念

7.Testing an ADT 测试抽象数据类型

8.Invariants 不变量

9.Rep Invariant and Abstraction Function   RI和抽象函数

10. Beneficent mutation   有益的变化

11.Documenting the AF,RI, and Safety from Rep Exposure 文档中包含这些

12.ADT invariants replace preconditions  ADT不变量代替前置条件

 

 

1. Abstraction and User-Defined Types

 

1.Abstraction抽象  用户只要管怎么用不用知道内部的信息

2.Modularity 模块化  把整个系统切分成组件

3.Encapsulation 封装 把模块包装起来

    4.Information hiding 隐藏模块信息

5.Separation of concerns 责任只对单一模块

 

 

2 Classifying Types and Operations 类型和操作的分类

可变和不可变数据类型

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

不变数据类型: 其操作不改变内部值,而是构造新的对象

 

 

Creators 构造器

Producers生产器  从老对象创建新的对象类型

Observers观察器 通过抽象类返回不同类型的对象

Mutators变值器,改变对象属性的方法

 

 

 

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

静态方法构造器通常被叫作 工厂方法

 

变值器通常返回void(也可以不是void)

如果返回值为 void ,则必然意味着它改变了对象的某些内部状态

 

 

3 Abstract Data Type Examples

 

 

 

 

4 Designing an Abstract Type

规则:

1.设计简洁、一致的操作

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

3.要么抽象、要么具体,不要混合 --- 要么针对抽象设计,要么针对具体应用的设计

5 Representation Independence表示独立性

 

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

除非 ADT 的操作指明了具体的 pre-和 post-condition ,否则不能改变 ADT 的内部表示 ——spec 规定了client 和 implementer 之间的契约。

6 Testing an Abstract Data Type

8 Rep Invariant and Abstraction Function RI与AF

一般情况下 ADT 的表示比较简单,有些时候需要复杂表示

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

ADT 开发者关注表示空间 R , client 关注抽象空间 A

 

抽象函数: R 和 A 之间映射关系的函数,即如何去解释 R 中的每一个值为 A 中的每一个值。

 

 

 

如何记录AF和RI

 

 

 

 

 

 

CheckRep 随时检查 RI 是否满足

CheckRep 确保rep非空

 

9.Beneficent mutation有益的改变

 

如果实现能不改变抽象值,那么是允许rep的值发生变化,且这种变化对客户端是隐藏的

 

对 immutable 的 ADT 来说,它在 A 空间的 abstract value 应是不变的。

但其内部表示的 R 空间中的取值则可以是变化的。

 

 

 

 

 

 

这种mutation 只是改变了 R 值,并未改变 A 值,对 client 来说是

immutable 的 “ AF 并非单射”,从一个 R 值变成了另一个 R 值

 

10 Documenting the AF, RI, and Safety from Rep Exposure

记录AF,RI以及表示泄漏的安全声明

 

在代码中用注释形式记录 AF 和 RI

要精确的记录 RI : rep 中的所有 fields何为有效

要精确记录 AF : 如何解释每一个 R值

表示泄漏的安全声明:给出理由,证明代码并未对外泄露其内部表示

Ex:

 

 

 

 

 

 

 

ADT 的规约里只能使用 client 可见的内容来撰写,包括参数、返回值、异常等。

如果规约里需要提及“值”,只能使用 A 空间中的“值”。(不能说内部的任何信息)

 

如何建立不变量(RI):

在对象的初始状态不变量为 true ,在对象发生变化时,不变量也要为 true

构造器和生产器在创建对象时要确保不变量为 true

变值器和观察器在执行时必须保持不变性。

在每个方法 return 之前,用 checkRep() 检查不变量是否得以保持。

 

 

11 ADT invariants replace preconditions不变量替换前置条件

 

 

用 ADT 不变量取代复杂的Precondition ,相当于将复杂的 precondition 封装到了 ADT 内部。

推荐阅读