MIT6.031学习笔记:AF&RI

Reading 11: Abstraction Functions & Rep Invariants

目标

今天介绍了几个想法:

  • 抽象函数(abstraction functions)
  • 表示不变量(representation invariants)

R:The space of representation values (or rep values for short)consists of the values of the actual implementation entities.(表示值构成的空间:实现者看到和使用的值)
A:The space of abstract values consists of the values that the type is designed to support. ( 抽象值构成的空间:client看到和使用的值)These are a figment of our imaginations.

例如,假设我们选择使用字符串来表示一组字符:

public class CharSet {
   
    private String s;    
    ...
    }

然后REP空间R包含字符串,抽象空间A是数学字符集。我们可以以图形的方式显示这两个值空间,从一个REP值到它所代表的抽象值有一个弧线。
在这里插入图片描述
关于这幅画有几件事要注意:

  • 每个抽象值都由某个REP值映射到。(满射) 实现抽象类型的目的是支持对抽象值的操作。那么,我们大概需要能够创建和操作所有可能的抽象值,因此它们必须是可表示的。
  • 一些抽象值由多个REP值映射到。(未必单射)之所以会出现这种情况,是因为表示不是一个严格的编码。将无序字符集表示为字符串的方法不止一种。
  • 并不是所有的REP值都被映射。(未必双射)在这种情况下,字符串“ABBC”没有映射,因为我们已经决定REP字符串不应该包含重复的字符串。这将使我们能够终止remove方法,因为我们知道最多只能有一个实例。

1.抽象函数(abstraction function)它将REP值映射到它们所代表的抽象值:

AF:R→A

图中的弧表示抽象函数。AF通常是局部的。
2.REP不变量(rep invariant)将代表价值映射到booleans:

RI:R→boolean

For a rep value r, RI(r) is true if and only if r is mapped(映射) by AF.换句话说,RI告诉我们给定的REP值是否格式良好。或者,你可以把RI想为一个集合:它是定义AF的rep值得子集.

例如,下边的图表显示禁止重复字符的字符集代表,RI(“a”)=真,RI(“ac”)=真,和RI(“ACB”)=真的,但是RI(“AA”)=虚假和RI(“ABBC”)=假。符合REP不变的REP值显示在R空间的绿色部分,并且必须映射到A空间中的抽象值。违反REP不变的REP值显示在红色区域,在A空间中没有等效的抽象值。
在这里插入图片描述
REP不变量和抽象函数都应该记录在代码中,就在REP本身的声明旁边:

public class CharSet {
   
    private String s;    
    // Rep invariant:    
    //   s contains no repeated characters    
    // Abstraction function:    
    //   AF(s) = {s[i] | 0 <= i < s.length()}    
    ...
    } 

关于抽象函数和REP不变量的一个常见混淆是,它们是由REP和抽象值空间的选择决定的,甚至是由抽象值空间单独决定的。如果是这样的话,那就没什么用了,因为他们会说一些多余的东西,这些东西已经在其他地方找到了。

抽象值空间本身并不能决定AF或RI:同一抽象类型可以有几个表示。

相同的rep值空间,可以有不同的rep不变量。即使具有相同类型的REP值空间和相同的REP不变量,我们仍然可以用不同的抽象函数(AF)对REP进行不同的解释。

The essential point is that implementing an abstract type means not only choosing the two spaces – the abstract value space for the specification and the rep value space for the implementation – but also deciding which rep values are legal, and how to interpret them as abstract values.(决定哪些代表价值是合法的,以及如何将它们解释为抽象值)

Example: rational numbers(有理数)
Here’s an example of an abstract data type for rational numbers. Look closely at its rep invariant and abstraction function. It would be completely reasonable to design another implementation of this same ADT with a more permissive RI.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值