6.抽象数据类型 (ADT)

抽象数据类型 (ADT)

1 ADT操作的四种类型

  1. 四种类型

    • creator:(从无到有)构造器,创建该类型的新对象,

      • String.valueOf(Object Obj)
      • 可能实现为构造函数、静态函数
    • producer:(从有到新)生产器,从该类型的旧对象创建新对象

      • String.concat()方法
    • observer:观察器,获取抽象类型的对象并返回不同类型的对象

      • .size()
    • mutator: 变值器,只有可变数据类型才有,是改变对象属性的方法,

      • list.add()StringBuilder .append()
      • 变值器通常返回void,意味着它改变了对象的某些内部状态
  2. 举例

  • String is immutable.
    • creators: String constructors
    • producers: concat , substring , toUpperCase
    • observers: length , charAt
    • mutators: none
  • List is mutable
    • creators: ArrayList and LinkedList constructors, Collections.singletonList
    • producers: Collections.unmodifiableList
    • observers: size , get
    • mutators: add , remove , addAll ,Collections.sort

2 表示独立性、表示泄露

  • 表示独立性(Representation Independence):
    client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端,程序员具有自己的自由。

  • 表示泄漏
    用户以某种方式可以看到内部结构,或者用户的一些操作会影响到内部表示。内部的成员变量、操作都不可以让用户看到。

  • 如何防止表示泄漏:

    • public变为private(防止外部修改)
    • 使用final关键字(防止内部修改)
    • 在规约中强调说明(不是个好的方案)
    • 最好的方法是使用不可变类型,彻底避免表示泄漏

3 不变量、表示不变量RI

  • 不变量
    是程序的一种属性,与客户端操作无关,对于程序的每个可能的运行时状态,它都始终为真。不变量包括表示不变量和避免表示泄漏。
  • 表示不变量RI(Rep Invariant)
    是一个重要的ADT不变量,判断某个具体的表示是否是合法(规约)的;也可以看作所有表示值的一个子集,包含了所有合法的表示值;也可看作一个条件,描述了什么是”合法“的表示值

4 表示空间、抽象空间、AF

在这里插入图片描述

  • 表示空间:以R表示,是开发者看到和使用的值

  • 抽象空间:以A表示,是用户看到和使用到的值

  • 两个空间是满射关系(每个抽象值都被某个表示值映射到,即用户的可选项一定在开发者的适用范围内),但未必是单射,也未必双射

  • 抽象函数AF:R和A之间的关系,即如何将R中的每一个值解释为A中的每一个值,在图中用箭头表示(将代码中用到的变量映射成逻辑需要的值)

5 以注释的形式撰写AF、RI

  • 规则:

    • AF和RI应该写到注释中,不能写到JavaDoc中,即,不可以将具体实现泄漏给用户,用户不能知道具体实现方法,也不能对某个具体类的成员变量(属性、字段)或者实现(方法)进行修改

    • 对于RI来说,像“所有字段都有效”这样的泛型语句是不够的,RI的工作是精确解释字段值有效与否的原因。

    • AF 提供“表示一组字符”这样的通用解释是不够的,要精确记录AF:如何解释每一个R值

  • 举例
    在这里插入图片描述

    在这里插入图片描述

*6 设计ADT

(1) 选择R和A;
(2) RI — 合法的表示值;
(3) 如何解释合法的表示值 —映射AF,做出具体的解释:每个rep value如何映射到abstract value

*7 checkRep()

  • asserts the rep invariant at run time
  • 在所有可能改变rep的方法内都要检查
  • Observer方法可以不用,但建议也要检查,以防止你的“万一”
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SolemnJudgment

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

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

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

打赏作者

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

抵扣说明:

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

余额充值