软件构造课学习体悟(三)关于RI和AF

一、Invariants
我们都知道,构造抽象数据类型的好处是很大的,原因就在于它的复用性。这可以为我们避免大量的代码重复编写,方便编程。那么一个好的抽象数据类型(ADT)的安全性以及对于规约的遵守即规范性必然是极佳的。不变量就是一个衡量抽象数据类型规范、稳定、安全的重要属性。
如何保护表示不变量呢,一般情况下有如下几种做法:
⚪通过私有变量来保护
⚪通过防御式拷贝防止泄露
⚪写规格说明(通常无用)
⚪使用Collections.unmodifiableList()这类方法来返回不变量

二、RI与AF
在考虑抽象类型时,有助于考虑两个值空间之间的关系。
表示值空间(或简称为rep值)由实际实现实体的值组成。在简单的情况下,抽象类型将被实现为单个对象,但更常见的是需要一个小的对象网络,因此这个值实际上通常是相当复杂的。
抽象值的空间由类型旨在支持的值组成。这些是我们想象中的一个虚构。它们是如所描述的那样不存在的柏拉图实体,但它们是我们想要查看抽象类型的元素的方式,作为该类型的客户端。例如,无界整数的抽象类型可能将数学整数作为其抽象值空间;例如,它可能被实现为一个原始(有界)整数数组的事实与该类型的用户无关。
作为ADT的编写者是要使用表示值空间来实现抽象值空间。我们将这两个空间之间的映射关系称为AF(抽象函数),AF是R->A的映射,它是满射,因为必须实现所有的情况,但不一定是单射,更不一定是双射。
表示不变量则是一个表示值空间到布尔值的映射,当不变量不发生变化时返回true,反之对应false。通常情况下RI在代码中可运用断言assert实现。
RI不是说“所有字段都有效”这样的通用语句。rep不变量的作用是准确地解释使字段值有效的原因。
AF也不仅是“表示一组字符”。抽象函数的工作是精确定义具体字段值的解释方式。作为一个函数,如果我们采用记录的AF并替换实际(合法)字段值,我们应该获得它们所代表的单个抽象值的完整描述。

三、关于RI和AF的举例
例(RI):实现直角三角形这一抽象数据类型,其中有三条边的长度,均以double型存储。
Rep不变量就为:勾股定理,即两条较短边的平方和等于第三边的平方。
例(AF):关于一个类型的字符串的抽象数据类(例如字符串中出现的字母个数为偶数)。
相应的AF就应该为:
AF(s)= union of {s[2i],……s[2i+1]} for 0 <= i < s.length()/2

四、总结
注意对于同样的表示空间R,可以有不同的RI,而对于同样的R和RI,同样可以有不同的AF,所有的这些属性都是为了ADT能够更加规范,更具安全性而服务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值