JAVA项目中ADT的编写

ADT,即抽象数据型,在计算机科学中有重要的意义。抽象数据型不关心数据如何存储和实现,强调作用于数据的操作。ADT又有如下特性:表示泄露、抽象函数AF、表示不变量RI。

一、ADT是什么?

传统类型会关注数据的具体表示。
而ADT由操作定义,只强调作用于数据上的操作,与其内部如何实现无关。

二、ADT分类

ADT可以被分为可变和不可变类型,也即mutable 和immutable。
可变类型的对象:提供了可改变其内部数据值得方法。
不可变类型的对象:没有改变其内部值得方法,想改变值只能构造一个新的对象。

三、ADT操作的分类

ADT的操作主要可以分为四类:Creator(构造器)、Producer(生产器)、Observer(观察器)和Mutator(变值器)。
3.1 Creator

构造器映射如下Creator : t* → T。
造器中虽然可以将对象作为参数,但不能将正在构造的对象作为参数。
构造器可以是实现为构造函数,例如ArrayList();
也可以实现为静态函数,例如Arrays.asList(), List.of()。
3.2 Producer

生产器映射如下Producer:T+, t* → T。
生产器就是接收某一个类的一个对象,生成出这个类的另一个对象。
String中的concat()方法是一个典型的生产器,这个函数会使用两个字符串生成一个它们的连接。
3.3 Observer

观察器映射如下Ovserver:T+, t* → t
观察器就是接收一个抽象类型的对象,返回一个不同类型的对象。
List中的Size()方法是一个典型的观察器,给定一个List,会返回其长度。
3.4 Mutator

变值器映射如下Mutator:T+, t* → void | t | T。
变值器就是改变对象属性的方法。
List中的add()方法是一个典型的变值器,其会在List添加元素。
变值器通常会返回void,返回void必然意味着它改变了对象的某些内部状态。但是变值器也并不一定得返回void,List中的add()方法就是反例。

四、ADT的设计
4.1 表示独立性 Representation Independence

表示独立性: client 使用 ADT 时无需考虑其内部如何实现, ADT 内部表示的变化不应影 响外部 spec 和客户端。
一个破坏表示独立性的例子,用户需要直接调用Family类中的属性,那么内部更改实现用户就得更改自己的代码。

4.2 表示不变性 Representation Invariants

不变量就是在任何时候都是true,表示不变性就是要保持不变量。
应当由ADT来负责其不变量,与client端的任何行为无关。

immutable就是一种典型的不变量。
但是mutable类型就会出现表示泄露的问题:

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

我们可以使用private和final关键字,让属性不能在类外被改变;同时在必要时进行内容的复制。

4.3 抽象函数 Abstraction Function

R空间:表示空间,是在类中表示的值。
A空间:抽象空间,用户看到和使用的值。
抽象函数AF: R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。AF是满射、非单射、未必双射。

不同的内部表示需要不同的AF和表示不变性。
即使是同样的R空间、同样的表示不变性,也可能有不同的AF,即“ 解释不同 ”。

设计ADT时应该遵循以下原则,而且要把这些选择和解释明确写到代码当中:
(1) 选择R空间和A空间并解释;
(2) 对合法的表示值(RI)解释;
(3) 对AF解释每个rep value如何映射到abstract value。

总结

ADT在软件构造中作用突出,但是设计好的ADT并不容易。这篇文章尝试记录一下ADT学习中的心得和体会,对ADT的更进一步理解还需要到具体的实践中进行。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值