软件构造复习--AF,RI ,checkRep ,rep exposure

1.    表示独立性
    client使用ADT时无需考虑内部如何实现,ADT内部表示的变化不应影响外部spec与client
    除非ADT的操作指明了具体的pre-condition和post-condition,否则不能改变ADT的内部
    表示,因为spec规定了client和和implementer之间的契约。
2.    测试ADT的方法:
    (1)测试creators,producers和mutators:调用observers来观察这些operations的结
            果是否满足spec;
    (2)测试observers:调用creators,produces和mutators等方法产生或改变对象,来
            看结果是否正确。
 
3.    不变量(invariants):
(1)    含义:保持不变量,是一个好的ADT的重要属性
            不变量:在任何时候总是true
                -Immutability是一个至关重要的不变量:一但不可变对象被创造,
                  其在整个生命周期中,总是表现出相同的价值。
                -由ADT来负责其不变量,而与client端的任何行为无关
(2)    为什么需要不变量?
            为保持程序的“正确性”,容易发生错误。
            例如:如果String没有不可变这一不变量,那么在所有使用String的地方,
            都要检查其是否改变了
(3)    表示泄露:
            进行修改:
            (1)用private和final关键字对其进行修改:
            (2)尽管如此,还有一定的缺陷:
                例如在一个方法里这样使用getTimestamp方法:               
                由于date是可变的,因此这样也会造成表示泄露,将内部的date进行了更改。      
                解决的办法:防御性拷贝:
                
            (3)这样就不能表示泄露了?在创建Tweet对象之前,为对象属性赋值的date若有
                    引用,仍然可以改变引用指向的对象的值,进而影响内部表示:这里24个tweet的date属性,引用的是同一个对象,因此会有:怎么解决呢?
                   仍然使用防御性拷贝
                当复制代价很高时,不得不把责任推给客户端:
                      在spec中加入:    
                     但由此引发的潜在bug也会很多。
           (4)在为难了这么多次后,我们发现罪恶之源就在于使用了mutable的对象。
                    因此,最好的办法就是使用immutable的类型,彻底避免表示泄露。
                    例如本例中,使用java.time.ZonedDateTime替代java.util.Date
     保持不变性和避免表示泄露,是ADT最重要的一个Invariant。
               
4.    表示不变量(Rep invariant)和抽象函数(Abstraction function)
(1)   表示空间R:实际实现中内部表示的值
             一般情况下ADT的表示比较简单,有些时候需要复杂表示,
            抽象空间A:client看到和使用的值 
            ADT实现者关注R,而用户关注A
            因此,我们在R和A可建立一个映射:
            这种映射一定是满射(surjective),而不一定是单射(not injective)
(2)   抽象函数:即R和A之间映射关系的函数            
(3)   在表示的过程中,就出现了表示不变性RI:
            即某个具体的“表示”是否是“合法的”
            也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值 
            也可将RI看作:一个条件,描述了什么是“合法”的表示值
        举例:charSet(字符集合)的RI和AF
  其为满射,非单射,更非双射
(4)AF和RI与内部表示的设计息息相关,不同的内部标识,需要设计不同的AF和RI:
        选择某种特定的表示方式R -> 进而制定某个子集是“合法的”(RI)
        -> 并为该子集中的每个值做出“解释”(AF)-即如何映射到抽象空间中的值
(5)同一种表示可能有不同的RI,进而有不同的AF
    例如:若上面的例子中RI内可以允许重复,但对字符的顺序加以限制,这样:
    
(6)即使同一种R,同样的RI,也可能有不同的AF,即“解释不同”
    例如:和上面第二个例子RI相同,却有不同的解释:
    
(7)随时检查RI是否满足:
    自写checkRep()方法,在创造和改变表示的方法中(creators,producers,
    mutators),进行调用。
    Observers正常来说不需调用checkRep(),但这是一种好的防御性措施。
更多参考::https://blog.csdn.net/qq_38969070/article/details/80719334

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值