关于AF、RI

思考一下两个值域之间的关系︰

表示域(space of representation values)里面包含的是值具体的实现实体。在简单的情况下,一个抽象类型只需要实现为单个的对象,但是更常见的情况是使用一个很多对象的网络。

抽象域里面包含的则是类型设计时支持使用的值。这些值是由表示域"抽象/想象"出来的,也是使用者关注的。例如,一个无限整数对象的抽象域是整个整数域,但是它的实现域可能是一个由原始整数类型〈有限)组成的数组实现的,而使用者只关注抽象域。

但是,实现者是非常"在意"表示域(和抽象域))的,因为实现者的责任就是实现表示域到抽象域的转换(映射)。

选择用字符串来表示一个字符集合︰

public class charset {
private string s;...
}

如上图所示,表示域R包含的是我们的实现实体(字符串),而抽象域里面是抽象类型表示的字符集合,我们用箭头表示这两个域之间的映射关系。这里要注意几点︰

·每一个抽象值都是由表示值映射而来。我们之前说过实现抽象类型的意义在于支持对于抽象值的操作,即我们需要能够创建和管理所有的抽象值,因此它们也必须是可表示的。

·一些抽象值是被多个表示值映射而来的。这是因为表示方法并不是固定的,我们可以灵活的表示一个抽象值。

·不是所有的表示值都能映射到抽象域中。在上面这个例子中,"abbc"就没有被映射。因为我们已经确定了表示值的字符串中不能含有重复的字符—―这样我们的remove方法就能在遇到第一个对应字符的时候停止,因为我们知道没有重复的字符。

由于我们不可能对每一个映射一一解释,为了描述这种对应关系和这两个域,我们再定义两个概念∶抽象函数abstraction function是表示值到其对应的抽象值的映射∶

AF :R →A

快照图中的箭头表示的就是抽象函数,可以看出,这种映射是满射,但不一定是单射(不一定是双射)。表示不变量rep invariant是表示值到布尔值的映射︰

Rl:R - boolean

对于表示值r,当且仅当r被AF映射到了A,Rl(r)为真。换句话说,RI告诉了我们哪些表示值是"良好组织"的(能够去表示A中的抽象值),在下图中,绿色表示的就是Rl(r)为真的部分,AF只在这个子集上有定义。 

对同一个定义域,有不同的表示不变量

public class Charset {
private string s;ll Rep invariant :
l ls.length( ) is even
l ls[0]<= s[1]<= ... <= s[s.length( )-1]l l Abstraction function:
llAF( s) = union of { c \ s[2i]<= c<= s[2i+1] }l /
for all 0<= i < s.length( )/2
...
}

总之,一个ADT的实现不仅是选择表示域(规格说明)和抽象域〈具体实现),同时也要决定哪一些表示值是合法的(表示不变量),合法表示会被怎么解释/映射(抽象函数)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值