对于AF、RI、Safety from rep exposure、spec的归纳总结
每次写实验时,在写代码之前都要进行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的归纳总结的更多相关文章
- SC || Chapter 3
┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 基本数据类型 && 对象数据类型 基本数据类型(int char long) 在栈中分配内存,不可变 对象数据类型(String BigInt ...
- 【软件构造】第三章第三节 抽象数据型(ADT)
第三章第三节 抽象数据型(ADT) 3-1节研究了“数据类型”及其特性 ; 3-2节研究了方法和操作的“规约”及其特性:在本节中,我们将数据和操作复合起来,构成ADT,学习ADT的核心特征,以及如何设 ...
- HIT Software Construction Lab 2
2019年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...
- 哈工大软件构造Lab3(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...
- 哈工大软件构造Lab2(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...
- 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 ...
- HIT Software Construction Lab 3
2019年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...
- P1119 灾后重建 floyd
题目背景 BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才 ...
- XYZZY spfa 最长路 判环
题意: 有n个点 m条边 每个边有权值 一开始有一百血 每次经过一条路都会加上其权值 判断是否能够到达n 显然 有正环的时候肯定能够到达 最短路好题!!!!!!! 显用folyed判断是否联通 ...
- CF552 E. Two Teams
题意:给出一串n个数 为1-n的乱序 一共有两个教练 教练一的队伍是1队 二是二队 教练一选择 当前队列中剩余人数的最大序号 将其和左边k个人 和右边k个人 变为一队 如此反复直到所有人 ...
随机推荐
- c++ 递推算法
各位大佬不妨先点个赞再看文章! 递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之 ...
- 命令行部署repmgr管理集群+switchover+切换测试
本次部署未使用securecmd/kbha工具.无需普通用户到root用户的互信. 建立系统数据库安装用户组及用户,在所有的节点执行 root用户登陆服务器,创建用户组及用户并且设置密码 [root@ ...
- Stochastic Methods in Finance (1)
Bootcamp Topics related to measure theory. 略去,详见测度论专栏中的文章 Expectations 令 \(X\) 为 \((\Omega, \mathcal ...
- you-get下载B站视频
you-get下载B站视频 库存 you-get介绍 https://github.com/soimort/you-get you-get是一个命令行工具,可以下载知名网站的视频 支持的网站有 ht ...
- Spacemacs换源无效果
我改了发现没用,找了好久问题,才发现变量名改了,以前修改源是configuration-layer–elpa-archives这个变量,现在改为configuration-layer-elpa-arc ...
- echarts入门到应用学习笔记
背景: 做疫情数据管理可视化,需要用到热点图在web端进行数据可视化,而地图就是必不可少的一个,看完文档,可以解决大部分小白的问题,保姆级攻略,即使你的js,这些学得不咋样(我就是小菜鸟) 步骤 环境 ...
- .NET NPOI导出时间、公式等格式化
1.业务背景 做导入某业务模块的Excel表格文件时,利用NPOI组件导入, ① 导入的日期错乱(如XX-X月-2022),关于此种情况之前没做格式化做了单独处理,可以查看文章.net NPOI Ex ...
- Hystrix断路器
1.介绍 ①产生原因 服务雪崩: 多个微服务之间调用,假设A调用B,C,B和C又调用其他微服务,这就是扇出. 如果扇出的链路上有某个微服务调用响应时间过长或者不可用,那么A调用会占用越来越多的系统资源 ...
- quasar使用electron打包
quasar使用electron打包 从构建好的项目中,我们不难发现,electron打包有两种方式: electron-packager打包 这篇博客是通过我尝试了很多种方法之后,最先开始,我使 ...
- JZOJ 3232. 【佛山市选2013】排列
题目 解析 很神奇的一道题 显然,对于一种排列,相当于给出了数字 \(1..n\) 的对应关系,且不重复不遗漏,刚好把 \(1\) 到 \(n\) 又包含了一遍. 对,连边! 每个数向它对应的数连边, ...