Abstraction Functions and Rep Invariants
参考链接: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相关推荐
- 【ICLR2019】Poster 论文汇总
ICLR2019 Poster 文章汇总, 共478 papers Convolutional Neural Networks on Non-uniform Geometrical Signals U ...
- (2019春)软件构造:雨课堂试卷(第3章)
目录 3.1(a) Data Type and Type Checking 多选题 第1题 2分 单选题 第2题 1分 多选题 第3题 2分 单选题 第4题 1分 多选题 第5题 2分 填空题 第6题 ...
- 雨课堂知识点总结(十)
3.3ADT 1.类WordList有四个方法,根据其方法定义来确定其类型 <1>public WordList(List<String> words) <2>pu ...
- Java代码可理解性/可读性及编码规范
目录 目录 0.写在前面 1.可理解性的标准(alias:可读性) 1.1.Code quality measurement:WTFs/min 1.2.Metrics 1.3.How to do in ...
- 7.3Assertions and Defensive Programming断言与防御式编程
7.3Assertions and Defensive Programming断言与防御式编程 1.回忆:设计ADT 2.Assertions 声称 --What to Assert and What ...
- 软件构造 6-3 Assertions and Defensive Programming
6.3 断言与防御式编程 一. 断言 assert 首先要遵循:以尽量不要引入 bug 的原则(防御式编程)编程. 静态检查 动态检查 不可变类型 不可变值 不可变引用 若无法避免,缩小 bu ...
- 2.2 The Environment Abstraction Layer (EAL)
原文链接: https://doc.dpdk.org/guides/prog_guide/overview.html#environment-abstraction-layer 正文如下: 2.2. ...
- CS61A fa2021 Composing Programs 2.7 Object Abstraction 对象抽象
原文 2.7 对象抽象(Object Abstraction) 面向对象为我们提供了多种数据抽象形式.各种抽象形式之间严密的逻辑层级使得我们在建立与使用时,不用担心他们之间会发生冲突. 对象抽象中 ...
- 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 ...
- Scala:Functions and Closures
1 object Functions { 2 def main(args: Array[String]) { 3 // 本地函数 4 def localFun(msg: String) = print ...
最新文章
- JavaScript语言标准
- mysql中获取一天、一周、一月时间数据的各种sql语句写法
- linux 错误 kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0
- Linux CenOS7下安装ActivetMQ
- 单体架构到微服务架构的带来的变化
- C语言切割多层字符串(strtok_r strtok使用方法)
- 一个使用 SAP Spartacus 开发的电商网站 - Lego 乐高
- moment.js 快捷查询
- pyDes vs pycrypto
- linux 用户设密码,linux 上添加用户,设置密码
- 页面加载速度优化的建议
- Ubuntu 如何定制桌面解放你的个性?
- 【java】读取html乱码
- 数据库实验报告1数据库定义实验
- 图像区块分割与采样YUV4:2:0
- DBProxy快速入门教程
- 人民币对美元汇率中间价报6.7774元 下调109个基点
- boost::geometry::ever_circling_iterator用法的测试程序
- YOLOv5桌面应用开发(从零开始)
- python:ocr图文识别(百度智能云API文字识别)
热门文章
- ESP32|基于ESP32制作的低成本、可拓展性高的NES游戏机(1)(开源ESP32 NES模拟器)-效果演示及介绍
- PostgreSQL的下载和安装使用步骤
- 香槟分校计算机专业毕业生去向,数据会告诉你 伊利诺伊大学香槟分校计算机系有多可怕...
- 工作学习总结-angular中的安全导航符?.和ts中的非空断言操作符!.
- 检查日期是否为节假日api
- 程序化交易系统使用说明
- 判定树与判定表的定义与相关练习
- 开发一流Android SDK
- 世界三大顶级音响_世界十大顶级音响排行榜前十名
- Session的钝化和活化(序列化和反序列化)