软件构造之ADT(抽象数据类型)

一、总述

传统的数据类型仅仅关注数据的具体表示形式,而抽象数据类型关注的则是“作用于数据上的操作”,程序员和用户无需关心数据如何具体存储,只需要设计和使用操作即可。这一点和面向对象的编程思维也是紧密相连的。(抽象、模块化、封装、信息隐藏、关注点分离(模块具有单独的责任,不要将一个责任分散在不同的模块中))。

二、类型和操作的具体分析

在这里我们将抽象操作类型分为三类:
1.Creators(构造器):给入一个或多个别的类型的对象,生成一个此类对象。
具体例子可以参考 构造器 Person(int age,String name …) (一个与该类名称相同的函数,可以通过输入一个人的各类属性信息来创建Person类)
2.Producer(生产器):在已有对象基础上产生新的对象
具体实例可以参考 String.concat()
3.Observers(观察器):给定一个但前对象,返回其它类型
具体实例可以参考getter函数,获取某个类的特定属性
4.Mutators (变值器):改变对象的属性 (注:变值器通常返回void)
参考setter函数,在外部调用setter函数,可以设定对象的属性

软件构造之ADT(抽象数据类型)_第1张图片
下面是抽象类型操作的例子
软件构造之ADT(抽象数据类型)_第2张图片
下面是有关于抽象数据类型的例子:

  1. int是immutable 类型,所以没有变值器
    Creator: 0,1,2,
    Producer: +,-,
    Observers:==,!=,<,
  2. String 是immutable 类型,所以没有变值器
    Creator:String constructors
    Producer:concat,substring,
    Observers:length,charAt

表示独立性(representation Independence)

表示独立性:用户使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不影响外部spec和客户端。
保证表示独立性的两条原则是:
1.所有属性前的修饰符必须用private。
2.所有方法的返回值不能是引用,必须做defensive copy。

举例:
一个类的属性声明为:private char[] a;
相对应的实现方法如下图:
软件构造之ADT(抽象数据类型)_第3张图片
测试:
测试方法间不可避免的会相互影响,测试时尽量把独立,不依赖其他操作的且被后面其他方法调用的方法放在前面测试。
且测试时应该用 creators,producers,mutators来产生或改变对象通过observers来观察改变是否正确。

表示不变性和抽象方法(Rep Invariant and Abstraction Function)

软件构造之ADT(抽象数据类型)_第4张图片
R:表示空间,实现时用到的值空间
A:抽象值空间,需要支持的值空间
AF : R --> A 满射、非单射、未必双射(一个从R空间映射到A空间的映射)

你可能感兴趣的:(软件构造,java)