参考链接:http://web.mit.edu/6.031/www/fa19/classes/11-abstraction-functions-rep-invariants/#reading_11_abstraction_functions_rep_invariants

1.Invariants(不变量)

不变量:程序在任何时间总是true的性质。一旦创建,不变性对象在其整个生命周期中都应始终代表相同的值。
Immutability就是一个典型的不变量

1.1.为什么需要不变量

①当ADT保留自己的不变量时,对代码的推理就变得容易得多。可以依靠String永远不会改变的事实,则可以在调试使用String的代码时或尝试为使用String的另一个ADT建立不变量时排除这种可能性。将其与可变的字符串类型进行对比,该可变的字符串类型可以由任何有权访问它的代码进行突变。要推断出涉及可变字符串的错误或不变式,您必须检查代码中可能使用该字符串的所有位置

②如果没有这个不变量,那么在所有使用String的地方,都要检查其是否改变了。

1.2.Immutability as a type of Invariants

表示泄露:不仅影响不变量,也影响力独立性:无法在不影响客户端的情况下改变其内部表示。

1.3.How to solve it ? --defensive copying (防御性拷贝)



①但是,当复制代价很高时,不得不这么做,由此引发的潜在的bug也很多。
②除非迫不得已,否则不要把希望寄托于客户端上,ADT 有责任保证自
己的invariants ,并避免“表示泄露”。
③最好的办法就是使用immutable

1.4.保持不变量

1.在对象的初始状态不变量为true,在对象发生变化时,不变量也要为true
2.构造器和生产器在创建对象时要确保不变量为true
3.变值器和观察器在执行时必须保持不变性。
4.在每个方法return之前,用checkRep()检查不变量是否得以保持。

2.Rep Invariant and Abstraction Function

表示值构成的空间:实现者看到和使用的值
抽象值构成的空间:client 看到和使用的值
ADT 开发者关注表示空间R ,client 关注抽象空间A

Abstraction Function

抽象函数:R 和A 之间映射关系的函数,即如何将R 中的每一个值解释为A 中的每一个值。
AF : R → A
AF : 满射、非单射、未必双射
R 中的部分值并非合法的,在A中无映射值

Rep Invariant: another important ADT invariants

▪ 表示不变性RI :某个具体的“表示”是否是“合法的”
▪ 也可将RI 看作:所有表示值的一个子集,包含了所有合法的表示值
▪ 也可将RI看作:一个条件,描述了什么是“合法”的表示值

What determine AF and RI?

不同的内部表示,需要设计不同的AF和RI
选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。

①同样的表示空间R ,可以有不同的RI

②即使是同样的R 、同样的RI ,也可能有不同的AF ,即“解释不同”。

3.Checking the Rep Invariant 随时检查RI是否满足

在所有可能改变rep 的方法内都要检查
Observer 方法可以不用,但建议也要检查,以防止你的“万一”

4.Documenting the AF, RI, and Safety from Rep Exposure

在代码中用注释形式记录AF和RI
要精确的记录RI:rep中的所有fields何为有效
要精确记录AF:如何解释每一个R值

给出理由,证明代码并未对外泄露其内部表示—— 自证清白

5.What an ADT spec may talk about

1.ADT的规约里也不应谈及任何内部表示的细节,以及R空间中的任何值
2.ADT的内部表示(私有属性)对外部都应严格不可见
3.故在代码中以注释的形式写出AF和RI而不能在Javadoc文档中,防止被外部看到而破坏表示独立性/信息隐藏

Abstraction Functions and Rep Invariants相关推荐

  1. 【ICLR2019】Poster 论文汇总

    ICLR2019 Poster 文章汇总, 共478 papers Convolutional Neural Networks on Non-uniform Geometrical Signals U ...

  2. (2019春)软件构造:雨课堂试卷(第3章)

    目录 3.1(a) Data Type and Type Checking 多选题 第1题 2分 单选题 第2题 1分 多选题 第3题 2分 单选题 第4题 1分 多选题 第5题 2分 填空题 第6题 ...

  3. 雨课堂知识点总结(十)

    3.3ADT 1.类WordList有四个方法,根据其方法定义来确定其类型 <1>public WordList(List<String> words) <2>pu ...

  4. Java代码可理解性/可读性及编码规范

    目录 目录 0.写在前面 1.可理解性的标准(alias:可读性) 1.1.Code quality measurement:WTFs/min 1.2.Metrics 1.3.How to do in ...

  5. 7.3Assertions and Defensive Programming断言与防御式编程

    7.3Assertions and Defensive Programming断言与防御式编程 1.回忆:设计ADT 2.Assertions 声称 --What to Assert and What ...

  6. 软件构造 6-3 Assertions and Defensive Programming

    6.3 断言与防御式编程 一. 断言 assert   首先要遵循:以尽量不要引入 bug 的原则(防御式编程)编程. 静态检查 动态检查 不可变类型 不可变值 不可变引用   若无法避免,缩小 bu ...

  7. 2.2 The Environment Abstraction Layer (EAL)

    原文链接: https://doc.dpdk.org/guides/prog_guide/overview.html#environment-abstraction-layer 正文如下: 2.2. ...

  8. CS61A fa2021 Composing Programs 2.7 Object Abstraction 对象抽象

    原文 2.7   对象抽象(Object Abstraction) 面向对象为我们提供了多种数据抽象形式.各种抽象形式之间严密的逻辑层级使得我们在建立与使用时,不用担心他们之间会发生冲突. 对象抽象中 ...

  9. The Log: What every software engineer should know about real-time data's unifying abstraction

    分布式经典文章,先mark,后面慢慢总结一下读书心得. 原文链接:The Log: What every software engineer should know about real-time d ...

  10. Scala:Functions and Closures

    1 object Functions { 2 def main(args: Array[String]) { 3 // 本地函数 4 def localFun(msg: String) = print ...

最新文章

  1. JavaScript语言标准
  2. mysql中获取一天、一周、一月时间数据的各种sql语句写法
  3. linux 错误 kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0
  4. Linux CenOS7下安装ActivetMQ
  5. 单体架构到微服务架构的带来的变化
  6. C语言切割多层字符串(strtok_r strtok使用方法)
  7. 一个使用 SAP Spartacus 开发的电商网站 - Lego 乐高
  8. moment.js 快捷查询
  9. pyDes vs pycrypto
  10. linux 用户设密码,linux 上添加用户,设置密码
  11. 页面加载速度优化的建议
  12. Ubuntu 如何定制桌面解放你的个性?
  13. 【java】读取html乱码
  14. 数据库实验报告1数据库定义实验
  15. 图像区块分割与采样YUV4:2:0
  16. DBProxy快速入门教程
  17. 人民币对美元汇率中间价报6.7774元 下调109个基点
  18. boost::geometry::ever_circling_iterator用法的测试程序
  19. YOLOv5桌面应用开发(从零开始)
  20. python:ocr图文识别(百度智能云API文字识别)

热门文章

  1. ESP32|基于ESP32制作的低成本、可拓展性高的NES游戏机(1)(开源ESP32 NES模拟器)-效果演示及介绍
  2. PostgreSQL的下载和安装使用步骤
  3. 香槟分校计算机专业毕业生去向,数据会告诉你 伊利诺伊大学香槟分校计算机系有多可怕...
  4. 工作学习总结-angular中的安全导航符?.和ts中的非空断言操作符!.
  5. 检查日期是否为节假日api
  6. 程序化交易系统使用说明
  7. 判定树与判定表的定义与相关练习
  8. 开发一流Android SDK
  9. 世界三大顶级音响_世界十大顶级音响排行榜前十名
  10. Session的钝化和活化(序列化和反序列化)