软件构造心得(7):spec、RI、AF、A概念辨析之RI

RI(rep invariant)

representation概念

representation即为了支持功能实现的ADT内部的数据结构(表示方式)。

“representation (the actual data structure or data fields used to implement it)”

rep independent

内部的数据结构的改变不影响外部的功能实现。

rep invariant

一种解释方式是一个rep到boolean(true or false)的映射。为什么要有这个映射?
软件构造心得(7):spec、RI、AF、A概念辨析之RI_第1张图片以上面那个例子说明。
string作为一个数据类型,我们想要用其来表示一个字母集合,我们发现其中有一定的鸿沟,而这个鸿沟是需要同时用RI和AF来填平的。按照我们一种默认的AF来看(即“abc”、“acb”、“bac”、“bca”、“cab”、“cba”都表示集合{a,b,c})我们仅仅需要一部分string,比如如“abbc”是不会被采用的。所以说,我们无论何时,总会有一部分的Rep是被需要的,而另一部分是我们表示所不需要的。这样我们就形成了一个需要与否的映射,一个限制,需要不需要的两个集合。
总而言之,这种限制、约束的方式,就是所谓的RI。

“ A rep invariant that maps rep values to booleans:
RI : R → boolean
 For a rep value r , RI® is true if and only if r is mapped by AF .
 In other words, RI tells us whether a given rep value is wellformed.
 Alternatively, you can think of RI as a set: it’s the subset of rep
values on which AF is defined.”

Abstract field 单独不能决定RI和AF

同一个抽象数据区域,它可以有多组RI、AF引导指向。这是implementtor个人的自由去决定怎么限制。

随时检查rep是否被满足

使用checkRep方法。checkRep方法中放置RI限制的检查。
在Constructor,mutator,generator和observer的返回之前(最好带上)都要使用这个方法检查是否仍然成立(即所要映射的仍然是满足相同约束的集合)。

小结

作为另一个抽象的概念,RI的理解和使用是至关重要的。清晰的认识到什么是RI,AF,并且给予随时的检查,能够让我们有效的避免潜在的bug,增强程序的强健性。

你可能感兴趣的:(软件构造,java,笔记)