【软件构造】抽象数据类型的表示不变性(RI)、抽象函数(AF)和表示泄漏 Rep Invariantand,Abstraction Function and Rep Exposure of ADT

         抽象数据类型(ADT)是强调操作的一种数据类型,用户程序员无需关心抽象数据类型的内部实现。ADT分为可变的(mutable)和不可变的(immutable),二者都在方法中都可以存在构造器(Creators)、生产器(Producers)和观察器(Observers),唯一的区别在于不可变的类型没有变值器(Mutators)以改变对象属性,而可变的类型允许存在变值器对域进行修改。

        表示独立性(Rep Independence)指的是client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。注意这里的表示独立性(Rep Independence)不是表示不变性(Rep Invariantand,表示独立性是一种性质,保证了ADT的内部表示和用户是区分开来的,除非rep说明了具体的前置条件和后置条件,用户是不允许修改ADT的内部表示的,即使rep说明了条件,也应该警告用户在安全的前提下修改表示。

表示泄漏(Rep Exposure)

        在介绍表示泄漏之前,我们先来看ADT的不变量(Invariants)。不变量指的是在任何时刻都为true的量,不依赖于其他模块和用户,仅有ADT自身维护。一般来说,这种不变量都是逻辑上的对于ADT的某些域的约定。不变量可以保证程序的正确性,容易发现错误。例如,不变性(immutable)就是一个不变量,保持这种不变量就是要求ADT没有变值器和可能发生表示泄漏的其他方法。

        表示泄露(Rep Exposure)指的是在某些情况,ADT向外部泄漏了内部的表示,从而使得调用者有能力修改ADT的内部表示。这种情况下可能会破坏ADT的不变量,并且也可能威胁到ADT的表示独立性。

        例如有如下的代码:

        我们发现,当客户端有这样的代码时,就发生了表示泄漏:

        此时不仅破坏了不变量——Tweet应该是不可变的,但是author这个变量却发生了变化;同时也破坏了表示独立性——没有办法在不影响客户端的情况下修改内部表示。为了维护这种不变量,并且杜绝表示泄漏,我们需要经常使用final和private等修饰域,并且使用防御性复制(Defensive copying)来让用户获得域的副本,而不是直接返回这个域。

        保持不变量和避免表示泄漏是ADT最重要的一个Invariant!

表示不变性(RI)和抽象函数(AF)

        表示空间(R)和抽象值空间(A):表示空间包含ADT的表示方法所能够表示的所有值,例如当一个域为字符串类型时,那么它的表示空间就是所有的字符串。抽象值空间包含所有用户看到和使用的值,是用户真正关心的地方,例如,我们用字符串中的所有字符表示一个字符集合,且字符串中没有重复字符,那么抽象值空间中就是一些由字符构成的集合。

        

        由R到A的映射是满射、未必单射、未必双射的,也就是说每一个抽象值都有一个表示值映射到它(满射),一些抽象值可以由多个表示值对应(未必单射),并不是所有表示值都有抽象值(未必双射)。上图包含了这些情况。

        我们如何区分哪些表示值应该有抽象值呢?也就是说,并不是所有符合ADT表示方法的值都应该有一个抽象值与之对应,这是显而易见的。那么我们如何区分这种差异呢?

        表示不变性(RI)指的是哪些表示值符合用户的需求,是应该有对应的抽象值的。可以将它看做表示值空间A的一个子集,包含了所有合法的表示值。

        得到这些合法的表示值之后,我们该如何将他们对应于抽象值呢?抽象函数AF即描述了这种映射关系。即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。

综上所述,在编写ADT的时候要通过文档的方式记录RI、AF和表示泄漏的安全性——自证清白。同时也要书写rep,这样才能设计出好的ADT。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蠢萌_小二爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值