对于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个人 变为一队 如此反复直到所有人 ...
随机推荐
- 前端基础知识-html(一)个人学习记录
待补充 块级元素与行内元素,常见举例 html5新特性?
- 顶层QWidget弹窗设置背景为透明,透明部分为黑色。
setAttribute(Qt::WA_TranslucentBackground); 设置此属性,解决.
- Stats collector is not responding 统计信息收集器没有响应
统计信息收集器没有响应/Stats collector is not responding 问题现象: kingbase数据库日志提示:统计信息收集器没有响应/Stats collector is n ...
- 职场IT老手教你3步教你玩转可视化大屏设计,让领导眼前一亮!
我是制造企业的IT中心的研发人员,平常工作就是配合业务部门出出报表,选型一些商业软件,并在内部负责实施运维.最近领导出去参观了一些数字化转型比较领先的工厂和制造企业,回来就甩给我几张图,问能不能我们也 ...
- @mapper注解
1.标记这是一个映射接口,这样子写还是需要写xml文件 package com.atguigu.springcloud.dao; import com.atguigu.springcloud.enti ...
- mybatis学习日记3
1.mybatis的延迟加载 问题:在一对多中,当我们有一个用户,他有100个账户 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 解决:在查询用户的时候, ...
- Hugging Face 每周速递: 扩散模型课程完成中文翻译,有个据说可以教 ChatGPT 看图的模型开源了
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- LOJ.数列分块入门3
题目 分析 由大题目知此题分块 注意处理前驱下标的合法性 \(Code\) #include<cstdio> #include<cmath> #include<algor ...
- Express 项目发送 Cookie
在使用 Cookie 之前,需要安装 Express 中间件--cookie-parser: npm i cookie-parser import express from "express ...
- vue2+ts 设计一个扑克牌比大小的游戏
首先