(软件构造)表示不变量RI和AF

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若有引用,仍然可以改变引用指向的对象的值,进而影响内部表示

           (4)在为难了这么多次后,我们发现罪恶之源就在于使用了mutable的对象。因此,最好的办法就是使用immutable的类型,彻底避免表示泄露。

     保持不变性和避免表示泄露,是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

(6)即使同一种R,同样的RI,也可能有不同的AF,即“解释不同”    例如:和上面第二个例子RI相同

(7)随时检查RI是否满足:

    自写checkRep()方法,在创造和改变表示的方法中(creators,producers,mutators),进行调用。

    Observers正常来说不需调用checkRep(),但这是一种好的防御性措施。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_52150376

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

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

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

打赏作者

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

抵扣说明:

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

余额充值