每次写实验时,在写代码之前都要进行AFRISafety from rep exposure spec的编写,过程十分繁琐,但是也非常有用。根据他们写代码,不仅可以找到切入点,而且思路更加清晰了,避免了许多bug的产生,更加满足客户端的要求。于是在此对他们做出总结归纳。

1.Spec

简介

Spec是程序员在设计ADT时对自己所写方法的规约,它规定了方法应该做什么,不应该做什么。而在接下来的设计中,测试用例的编写就需要依靠Spec的描述,因为程序员所编写的代码必定是符合spec的,否则就是不合格的。同时,有了Spec的存在,客户端在使用代码时就会有所依据,好的Spec可以大大节省客户端使用自己的API时所需要的时间,并且大大降低了客户端对自己所编写的代码的误解。

主要内容

Spec的主要内容分为以下三部分:

1. 前置条件precondition:这是对客户端的约束,是用户在使用方法时必须满足的条件。在Java中一般使用声明@param说明每个参数的前置条件。

2. 后置条件postcondition:这是对开发者的约束,也是方法结束时设计者必须满足的内容。在Java中一般使用如下两种声明,其内容及用途如下:

@return:对后置条件的说明,一般为返回值;
@throws:说明出现异常的时候会发生什么,一般为异常处理方式。

spec强弱

若想要Spec变强,可以采用如下方式:

1. 更宽松的前置条件

2. 更严格的后置条件

有些spec的强弱是无法比较的,没有强弱之分。

注意事项

程序员不应该让用户知道方法的内部逻辑是怎么样的,以避免恶意用户对代码结构的破坏。

2.AF和RI

两个空间:表示空间,抽象空间

1.表示空间里面包含的是值具体的实现实体。一般情况下ADT的表示比较简单,有些时候需要复杂表示。
2.抽象空间里面包含的则是类型设计时支持使用的值。这些值是由表示空间抽象出来的,也是使用者关注的。
3.ADT实现者关注表示空间,而用户关注的是抽象空间。
4.R->A(表示空间->抽象空间)映射特点
(1)每一个抽象值都是由表示值映射而来 ,即满射:每个抽象值被映射到一些rep值
(2)一些抽象值是被多个表示值映射而来的,即未必单射:一些抽象值被映射到多个rep值
(3)不是所有的表示值都能映射到抽象域中,即未必双射:并非所有的rep值都被映射。
我们用一个表示分数的ADT来举例,该ADT的rep为x(分子),y(分母):
例(1)抽象空间的所有分数都可以由表示空间的x/y来表示
例(2)对于两组不同的x,y其约分后可能表示为同一个分数
例(3)非法rep,例如y=0,则在抽象空间内没有对应的映射

AF

全称Abstraction function(抽象函数),类似于一个映射

其中R是创建的类,A是抽象值构成的空间

就是构造的程序的 ADT里面的量 到 外部人员想要操作的量 的映射

AF一定是满射,不一定是单射,也就不一定是双射

(也就是R中的类不一定能找到A,但是A中的抽象必须有R中对应的类)

RI

RI全称是:Representation invariant(表示不变量),用来表示“什么样的类满足抽象”

以上图为例,“abbc”就是不满足RI的元素,一个满足这个图的RI就是“不可以有重复的字母”

也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值

也可将RI看作:一个条件,描述了什么是“合法”的表示值
(AF,RI的具体实例参考实验2的代码)

注意事项

RI、AF存在如下关系:

相同的R可能存在不同的RI;

即使是同样的R、 RI,也可以根据解释不同,而获得不同的AF;

两个ADT有相同的rep和相同的AF,但其R也不—定相同。

不应该给client看的内容有AF、RI、Rep exposure safety argument、testing strategy、Rep、Implementation和Test cases等等,留给client的只有Spec。

可以通过写checkRep()随时检查RI

3.Safety from rep exposure

防止表示泄露的方法

通常有以下几种方法:

1.用private和final关键字对其进行修改:------即将类中所有的属性(变量)定义为private类型,目的是不让用户得到你的内部属性
2.尽量使用immutable数据类型,比如能使用String就不使用StringBuilder,能使用Instance或
LocalDateTime就不使用Data
3.返回值使用防御式拷贝

对于AF、RI、Safety from rep exposure、spec的归纳总结的更多相关文章

  1. SC || Chapter 3

    ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 基本数据类型 && 对象数据类型 基本数据类型(int char long) 在栈中分配内存,不可变 对象数据类型(String BigInt ...

  2. 【软件构造】第三章第三节 抽象数据型(ADT)

    第三章第三节 抽象数据型(ADT) 3-1节研究了“数据类型”及其特性 ; 3-2节研究了方法和操作的“规约”及其特性:在本节中,我们将数据和操作复合起来,构成ADT,学习ADT的核心特征,以及如何设 ...

  3. HIT Software Construction Lab 2

    2019年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录   1 实验目标概 ...

  4. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  5. 哈工大软件构造Lab2(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...

  6. Rep Invariant and Abstraction Function

    * According to the Reading 13 of MIT 6.005 course In order to finish Lab 2, in which the ps 2 gives ...

  7. HIT Software Construction Lab 3

    ​ 2019年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...

  8. P1119 灾后重建 floyd

    题目背景 BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才 ...

  9. XYZZY spfa 最长路 判环

    题意: 有n个点  m条边  每个边有权值 一开始有一百血  每次经过一条路都会加上其权值 判断是否能够到达n 显然  有正环的时候肯定能够到达 最短路好题!!!!!!! 显用folyed判断是否联通 ...

  10. CF552 E. Two Teams

    题意:给出一串n个数   为1-n的乱序 一共有两个教练   教练一的队伍是1队  二是二队 教练一选择 当前队列中剩余人数的最大序号   将其和左边k个人 和右边k个人 变为一队 如此反复直到所有人 ...

随机推荐

  1. 写出单个字符到文件-flush方法和close方法的区别

    写出单个字符到文件 flush方法和close方法的区别 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中.但是关闭的流对象,是无法继续写出数据的.如果我们既想写出数据,又想继续使用流,就 ...

  2. ubuntu下yaml-cpp安装与使用

    安装 从GitHub上下载源码编译安装:git clone https://github.com/jbeder/yaml-cpp.git: 进入源码目录并创建一个 build 目录:cd yaml-c ...

  3. 10月27日内容总结——hashlib加密模块和logging、subprocess模块

    目录 一.hashlib加密模块 1.何为加密 2.为什么加密 3.如何判断数据是否以加密 4.密文的长短有什么意义 5.加密算法的基本操作 二.加密补充说明 三.subprocess模块 1.sub ...

  4. layui富文本的使用注意事项以及拓展

    一.引入layui.js文件 二.初始化编辑器 PS:layedit.set({}) 方法必须要在初始化编辑器之前 var editIndex, layedit, layer; $(function ...

  5. 如何快速搭建 Maven私服Nexus【实践可行版】

    搭建私服Nexus Nexus 一般用来搭建位于组织或公司内部的 Maven 私服,代理所有的仓库(包括中央仓库),用户通过它就可以获取和管理所有所需的 Maven 构件. Nexus 开源版具有以下 ...

  6. imax6开发版_挂载NFS文件系统

    挂载:mount -o vers=4 192.168.30.108:/home/penuel/linux_imax6/workdir /home/root/workdir 取消挂载:umount /h ...

  7. ArcGIS Pro SDK 002 对数据文件的读取和操作

    做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储.ArcGIS Pro SDK中对数据源操作的API和ArcObjects ...

  8. JZOJ 4043. 【雅礼集训2015Kzf】洪水

    题目 题解 很明显的 \(dp\) \(f_u = \min(a_u, \sum_{(u,v) \in E}f_v)\) 然后套路的设 \(g_u\) 表示不管重儿子的 \(f_u\) \(f_u = ...

  9. 提取show config命令结果

    import re import os # 从命令收集日志文件中,提取show config命令结果. file_list = os.listdir(os.getcwd()) dirname = os ...

  10. 深入解读.NET MAUI音乐播放器项目(三):界面交互

    UI设计的本质是对于产品的理解在界面中多种形式的映射,当需求和定位不同时,对相同的功能表达出了不同的界面和交互方式. 作为播放器,界面可以是千差万别的.<番茄播放器>的iOS平台上我开发了 ...