软件构造第三章——ADT的设计细节

一.回顾

上一篇我们说了ADT定义,应该遵循的一些原则,表示独立性,不变性,防止表示泄露。这回我认为我们侧重于ADT设计的一些具体内容。

二.RI与AF

一个ADT是定义在一组操作上的数据类型,操作有了以后,我们要实现rep,而rep是具体的,功能是抽象的。我们需要解释如何把具体的rep映射成抽象的表示。
我们把具体的rep值空间称之为R空间,把抽象的值称为A空间。
比如说:我们要表示一个小写字母的集合,a.我们可以用LIST,R空间就定义在LIST上了,b.我们也可以用一个数组,R空间就定义在数组上了。
A空间就是字母的集合。
而AF(abstraction function)就是R到A的映射,比如定义a.,我说所有出现在LIST的字母都在字母集合里AF:LIST->{s| LIST.contains(s)}
而我也可以定义AF:LIST->{s| LIST.contains(s)==false}
在这两个定义下,同样的“abcde” 在a.下就是"abcde",而在b.下就是除了“abcde”以外的小写字母。

AF不是一一映射:存在不是映射的值
AF是满映射:每个A都应该有一个R值对应。
AF不是单映射:不同的R对应同一个值比如上面的.a,R为“abc”与“aabc”表示的是一样的。

而RI(Represention Invariant)就是规定哪些值可以被映射,是R的一个合法子集,比如我们规定在LIST中每个字符只能出现一次,那么上文提到的“aabc”就是非法的。
RI也是我们上次说的不变性的一种
RI与AF是ADT中必须设计的值,不同的RI相同的AF,或不同的AF相同的RI所能表示的ADT都是不同的。

三.保持不变性

不变性是我们要求的ADT必须永远为真的属性,除了不可变,这次的RI也是一种不变性。
我们在代码中应该时刻用checkRep()方法断言RI。
checkRep()方法检查RI,调用mutator,creator,producer必须用,而observer建议使用。
在所有方法check代表更好抓住BUG

不变性的建立如下
1.creator,producer建立不变性
2.mutator,observer维护不变性
3.checkRep检查不变性
4.没有表示泄露

四.RI与AF记录与有益可变性

现在我们可以说不可变对象的不可变是指A空间不可变,而如果R空间改变A空间不变我们认为也是可以的。
但这并不意味可以随意出现mutator在不可变类型中。

RI与AF都是设计者的默契,这些应该写在注释中而不是javadoc文档中。
注释写明:field为什么有效(RI),如何解读field(AF),给出表示泄露的防范。

五.

现在已经了解了如何设计一款ADT中除了数据类型与方法应该考虑的内容。
ADT里的东西分为两种,能拿出去的和不能拿出去的,拿出去的是抽象,拿不出去的是具体。拿出去的可以写在javadoc里,拿不出去的就写在注释里。

我们大致总结一下ADT设计流程
1.分析需求写spec
2.选定represention
3.实现
而RI,AF都属于represention的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值