本周讲了AF、RI、Safety from rep exposure、spec等概念。这些是辅助程序设计的重要部分,需要在代码中以注释的形式体现,可以显著提高代码可读性,明确设计的目的。必须要养成写的习惯!!!

设计规约

1.规约的强弱
前置条件更弱,或后置条件更强的规约,是较强的规约。如果一个规约强于另一个规约,则可以用较强的代替较弱的。

2.规约越强,开发者的责任越重,使用者的责任越轻。如Lab1的GenerateMagicSquare,如果规约要求必须输入奇数(较强前置条件),则需要用户进行操作。如果不要求必须输入奇数(较弱前置条件),开发者就需要在程序中添加对输入奇数的操作。
3.某个具体实现,如果满足规约,则落在其范围内;否则在其之外。越强的规约,对应的面积越小。

抽象数据型(ADT)

1.ADT的特性:表示泄露、抽象函数AF、表示不变量RI。AF、RI用户不可见。
2.ADT是由操作定义的,和内部实现无关。

ADT类型和方法的分类

1.ADT可以分为可变和不可变数据类型。可变类型的对象提供了可改变其内部数据的值的操作(如StringBuilder);不可变数据类型的操作不改变内部值,而是构造新的对象(如String)。
2.抽象类型的方法分类:构造器、生产器、观察器、变值器。
生产器,例如String.concat(),以两个String对象为参数,返回一个新的String对象。
观察器,例如List.size(),返回int。
变值器,例如List.add(),改变对象属性。 !!!只在可变类型中出现

3.构造器可以实现为构造方法或者静态方法。实现为静态方法称为工厂方法,工厂方法属于类,而不属于某个具体对象。
4.返回void一定是变值器,如果返回void则必然改变了对象的某些内部状态。变值器不一定返回void。

表示独立性

用户使用ADT时无需考虑其内部实现,ADT内部表示的变化不影响spec和客户端。
违反表示独立性的例子:严格限制了people的类型

遵循表示独立性的例子:同时把people改为private

测试ADT

测试构造器、生产器、变值器:调用观察器查看结果是否满足规约
测试观察器:调用构造器、生产器、变值器产生或改变对象,查看结果是否正确

ADT不变量

1.不变量在任何时候都是true。
2.由ADT负责不变量,不变量和客户端的任何行为无关。
3.总是要假设用户有“恶意”破坏ADT的不变量(防御式编程)。
4.除非迫不得已,不要把希望寄托于客户端上,ADT有责任保证自身的不变量,并且避免“表示泄露”。最好的办法就是使用不可变的类型,彻底避免表示泄露。
5.如果一个类不是不可变的,改变属性的方式:
-通过属性中的操作
-表示暴露,方法返回属性的引用

RI和AF

1.抽象值构成的空间是客户端看到和使用的值(真实的数据)。ADT开发者关注表示空间R,客户端关注抽象空间A。

2.R空间到A空间满足的性质:
-满射,用户使用的数据必须在表示空间出现。
-未必单射,抽象空间的值可能对应表示空间的多个值
-未必双射,表示空间的值可能无法对应抽象空间的值
3.AF:R->A(抽象函数)给出R空间的数据,如何映射到A空间的解释。
RI:R->boolean(表示不变性)某个具体的表示是否是合法的。也可以将RI看成所有表示值的一个子集,包含了所有合法的表示值。同时可以将RI看作描述什么是合法表示值的条件。

4.选择某种特定的表示方式R,进而指定某个子集是合法的(RI),并为该自己中的每个值做出解释(AF),即如何映射到抽象空间的值。在设计ADT时,先确定AF再确定RI。
5.在所有可能改变rep的方法内都要检查RI是否满足。

有益可变性

1.对不可变ADT来说,它在A空间的抽象值是不变的。但R空间的表示值是可以变化的。
2.不可变类型的属性不一定不能改变。只要不影响A空间数据的变化,属性改变是可以的。

表示泄露的安全声明

给出理由证明代码并未对外泄露其内部表示。

总结

1.ADT规约里只能使用客户端可见内容来撰写,包括参数、返回值、异常等。如果规约里需要提及“值”,只能使用A空间的值。
2.ADT规约里不应该谈及任何内部表示的细节,以及R空间的任何值。
3.ADT的内部表示(private属性)对外部严格不可见。
4.在注释而不是Javadoc中写AF和RI,防止被外部看到而破坏表示独立性和信息隐藏。
5.表示泄露的风险:一旦泄露,ADT的内部表示可能在程序的任何位置发生改变,而不是限制在ADT内部,从而无法保证ADT不变量是否始终为true。
6.检测ADT保持不变量的三个标准:
-创建对象的时候满足不变量为true——对应creators、producers
-属性改变时满足不变量为true——对应mutators、observers
-没有发生表示泄露

软件构造学习笔记-第五周相关推荐

  1. 软件构造学习笔记-第八周

    本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...

  2. 软件构造学习笔记-第三周

    本周介绍了软件开发的几种模型,并重点介绍了Git.Git是分布式版本控制系统,可以通过SSH key建立远程与本地的连接,通过Git Bash中的命令进行文件的上传和下载.对于这门课程,Git的主要作 ...

  3. 软件构造学习笔记-第十一周

    本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式.正则表达式用于对文本文件的处理.在实验3中有一项要求是对输入文本进行解析,构造航班.要求表达式不仅要读入合法数 ...

  4. 软件构造学习笔记-第六周

    这周的重点是重载和重写.重载要求两方法的签名必须不同,而重写则要求两方法的签名必须相同.重载可以发生在同一个类中,也可以发生在父类和子类中:重写必须发生在父类和子类中.接口/抽象类不具有构造方法,只有 ...

  5. 软件构造学习笔记-第十三周

    本周内容较少,主要介绍了断言以及防御式编程.断言一般用于程序开发阶段,用以快速发现错误,而在程序正式版本中则较少使用断言.一般来说,程序员使用(输入)的数据可以使用断言检测合法性,而用户输入数据则采用 ...

  6. 软件构造学习笔记-第七周

    本周只有一节课,内容较少.对于不可变类型的相等比较,需要重写equals和hashCode方法,实现观察等价性.对于可变类型,不建议重写以上两方法,按照默认比较方式(比较内存地址)即可. 可变类型的相 ...

  7. 软件调试学习笔记(五)—— 软件断点内存断点

    软件调试学习笔记(五)-- 软件断点&内存断点 调试的本质 软件断点 软件断点的执行流程 分析INT 3执行流程 实验:处理软件断点 内存断点 内存断点的执行流程 实验:处理内存断点 调试的本 ...

  8. 软件构造学习笔记-第九周、第十周

    因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...

  9. 哈工大软件构造学习笔记1 Views and Quality Objectives of Software Construction

    先要搞清楚软件构造的对象是什么,如何刻画,在关注如何构造. 1,Five key quality objectives of software construction 软件构造的五个关键质量目标 容 ...

最新文章

  1. 5位华人博士入选2021苹果学者!其中1名北大在读博士师从崔斌教授
  2. 《jQuery Mobile入门经典》—— 2.7 练习
  3. 基本表改变视图不改变为什么_中国白酒包装是真的很丑吗,为什么不改变包装?...
  4. Docker实战:Docker安装部署RabbitMQ
  5. Ajax框架DWR入门
  6. JS高级进阶之ECMAScript 常见面试题
  7. 传三星8英寸Galaxy Tab 3平板最早将于6月上市
  8. 全局变量求平均分最高分最低分_想去江苏读大学,2021届山东考生需要多少分?...
  9. MySQL数据库的数据类型以及取值范围详解
  10. mysql的存储过程放在哪里_mysql存储过程,这个错在哪里?
  11. Unsupported major.minor version (jdk版本错误)解决方案办法
  12. Python列表和元组比较
  13. golang 连接多个mysql_Prometheus+Grafana监控MySQL
  14. win10撤销计算机密码,电脑密码怎么取消 Win10如何取消开机密码
  15. phpQuery乱码解决经验分享
  16. python print文本和数字混合_详解Python中的文本处理
  17. 新概念英语第三册单词
  18. 电脑桌面两个计算机图标怎么删除,电脑桌面上有个图标删除不掉|?怎么处理?
  19. 内网创建https网站的SSL证书、代码签名证书
  20. Spring boot项目 maven多模块打包,子模块报错问题解决

热门文章

  1. 找不到r低版本_R 语言与数据挖掘直播班开始招生,生信分析帮你发高分文章
  2. [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
  3. CSDN博客文章阅读模式插件(附源码)
  4. C语言按行和列求平均成绩代码(指针,二维数组)
  5. 剑指offer之合并已排序链表(递归实现)
  6. linux之让终端支持C++11/14编译cpp文件
  7. Android之ActivityManager与Proxy模式的运用
  8. Android之基于BaseAdapter和SimpleAdapter的GridView
  9. php基础教程 第八步循环补充
  10. 【C语言简单说】八:分支结构之if...else...(2)