2021-07-06

软件构造之ADT的一些感悟

前言:
抽象数据类型和表示独立性是我们能够将如何在程序中使用数据与数据结构本身的特定形式分离开。设计良好的抽象数据结构,通过封装来避免客户端获取数据内部表示,避免潜在的bug,起到在client和implementer之间建立防火墙的作用。
抽象类型:
强调“作用于数据上的操作”,程序员和用户无需关心数据如何具体存储的,秩序设计或使用操作即可。可以说,ADT是由操作定义的,于其内部如何实现无关。
可变与不可变数据类型:可变数据类型的对象提供了可改变其内部数据的值 的操作,而不可变数据类型的操作不改变内部值,而实构造新的对象。举例而言,StringBuilder是String的可变版本,但这两个的Java类型肯定不相同,不能相互转换。
抽象类型的操作:
一个抽象类型包括构造器、生产器、观察器和变值器(改变对象属性的方法)。其中:构造器的可能实现为构造函数或静态函数,后者被称为一个工厂方法。变值器通常返回void,意味着改变了对象内部的某些状态(当然变值器也可以返回非空类型)。
设计一个抽象类:

  1. 设计简洁、一致的操作;2. 要足以支持客户对数据多做的所有操作需要,且用操作满足用户需要的难度要低;3. 要么抽象要么具体,不要混合。
    表示独立性:
    表示独立性指用户在使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。除非ADT的操作指明了具体的pre和post-condition,否则不能改变ADT的内部表示,可以看作spec规定了client和implementer之间的契约。代表独立性的魅力在于,某函数的现有客户端只依赖于它的公共方法的规约,而不是它的私有字段,我们可以在不检查和更改所有的客户端代码的情况下进行此更改。
    测试一个ADT:
    调用观察器观察剩下三个操作的结果是否满足spec,反过来,调用这三个操作等方法产生或改变对象,看结果是否正确来测试观察器。
    图片来自软件构造PPT,侵删!
    图片来自软件构造PPT,侵删!
    变量:
    由ADT负责不变量,与客户端的任何行为无关。因为我们总要假设有客户端由恶意地破坏ADT的不变量,所以需要不变量保持程序的正确性并且易发现错误。一旦发生表示泄露,不仅影响不变性,也影响表示独立性,即无法在不影响客户端地情况下改变其内部表示。防御式拷贝:对可变对象进行复制,避免将引用泄露给rep,确保类不变量在任何输入中存储,以最小化可变性。通常,我们检查所有ADT的陈宗座参数和返回类型,如果任何类型是可变的,则确保我们的实现不会返回对其表示的直接引用。最好的办法就是使用不可变的类型,彻底表示表示泄露。
    AF与RI:
    AT(抽象函数),表示R和A之间映射关系的函数,即如何去结视R中的每一个值为A中的每一个值。RI(表示不变性),表示某个具体的“表示”是否是“合法的”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值