OO第三次博客作业
一、规格化的发展历史
最早的程序设计都是面向机器,从一开始使用的机器语言,到后面的汇编语言,都是面向机器的语言,编写困难也容易出错。随着需求的发展,程序的编写从面向机器走向面向过程,但由于goto语句导致的面条式代码,极大的限制了程序的规模,“软件危机”产生,程序设计的思想又经历了几次革命,“结构化程序设计”作为解决软件危机的方案被提出来了,这个概念通过“自顶向下、逐步细化、模块化”的方法降低程序的复杂度,但需求永远发展的更快,又产生了第二次软件危机,这次软件危机主要体现在可扩展性和可维护性上面,在这种背景下,面向对象的思想开始流行起来,从面向过程到面向对象,人们意识到了,为了保证程序的正确性和提升精简程度,同时注重后续维护和扩展的需求,要对整体程序进行更好的统筹规划,规格化就是辅助人类达到这个目标的一个极好的工具。
二、写法改进
因为这几次作业都没有被报规格方面的bug,我就直接列举一些自己需要改进的规格写法了。
1.前置条件不完善、后置条件使用自然语言
/**
* @REQUIRES: None;
* @MODIFIES: None;
* @EFFECTS: return state string;
*/
⬇
⬇
⬇
/**
* @REQUIRES: \this.mode>=0&&\this.mode<=3;
* @MODIFIES: None;
* @EFFECTS: (\result="stop") ==> (mode == 3);
* (\result="in service") ==> (mode == 0);
* (\result="waiting to serve") ==> (mode == 2);
* (\result="picking up passenger") ==> (mode == 1);
*/
2.前置条件不全面
/**
* @REQUIRES: None;
* @MODIFIES: \this.loacte;
* @EFFECTS: (\this.locate[i][j] == 1) ==> (\old.this.locate[i][j] == 2);
* (\this.locate[i][j] == 2) ==> (\old.this.locate[i][j] == 1);
*/
⬇
⬇
⬇
/**
* @REQUIRES: (i>=0)&&(i<80)&&(j>=0)&&(j<80);
* @MODIFIES: \this.loacte;
* @EFFECTS: (\this.locate[i][j] == 1) ==> (\old.this.locate[i][j] == 2);
* (\this.locate[i][j] == 2) ==> (\old.this.locate[i][j] == 1);
*/
3.前置及后置条件不全面
/**
* @REQUIRES: None;
* @MODIFIES: None;
* @EFFECTS: (mode == 2)&&(resttimer == 0);
*/
⬇
⬇
⬇
/** * @REQUIRES: re!=null; * @MODIFIES: \this.r;this.mode;this.resttimer; * @EFFECTS: (\this.mode == 2)&&(\this.resttimer == 0)&&(this.r == re); */
4.构造方法也应当约束传入的参数
/**
* @REQUIRES: None;
* @MODIFIES: this;
* @EFFECTS: (\this.start == s)&&(this.recordpath == rp)&&(this.end == e)&&(this.time == t);
*/
⬇
⬇
⬇
/** * @REQUIRES: (s != null)&&(rp != null)&&(e != null)&&(t != null); * @MODIFIES: this; * @EFFECTS: (\this.start == s)&&(this.recordpath == rp)&&(this.end == e)&&(this.time == t); */
5.后置条件使用自然语言
/**
* @REQUIRES: p != null;
* @MODIFIES: \this.pos;
* @EFFECTS:set this.pos to p;
*/
⬇
⬇
⬇
/** * @REQUIRES: p != null; * @MODIFIES: \this.pos; * @EFFECTS:(\this.pos == p); */
三、总结归纳
刚开始在得知要写规格的时候心里是比较烦又觉得这个没什么用,但是几次作业下来也算是明白了规格的意义,在扩展的时候有时会忘了当时写这个方法的时候有什么限制条件,此时规格就能提醒我,一份小作业尚且如此,大型工程想必是更加需要这种规范来保证多人合作的效率和准确性了。
OO第三次博客作业的更多相关文章
- [BUAA OO]第三次博客作业
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...
- OO第三次博客作业——规格
OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...
- OO第三次博客作业---透过代码看设计
不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...
- oo第三单元博客作业
JML语言理论基础 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,他鼓励你用一种全新的方式来看待Java的类和方法.JML是一种行为接口规格语言 ...
- OO第三次博客作业(第三单元总结)
(1)梳理JML语言的理论基础.应用工具链情况 Java 建模语言(JML)将注释添加到 Java 代码中,这样我们就可以确定方法所执行的内容,而不必说明它们如何做到这一点.有了 JML,我们就可以描 ...
- OO第三次博客作业--第三单元总结
一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...
- OO第四次博客作业!
oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...
- OO第4次博客作业
OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...
- OO第四单元博客作业
OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...
随机推荐
- 个人认为一个比较完整,基于tp5平台,可快速开发的B2C平台
现在全民创业,做电商的人很多,大大小小的技术公司也很多,报价也很奇葩,从100到十万的都有,把人都能转晕,有朋友问我,你们创业是不是很赚钱,其实,外行不知道内行的苦,创业控制成本第一,活下来才能赚钱. ...
- ThetaSome_ThetaAll子查询
基本语法 表达式 θ some(子查询) 表达式 θ all (子查询) 语法中,θ是比较运算符 <,>,>=,<=,=,<> 如果表达式的值至少与子查询的结果的某 ...
- Selenium Locating Elements
Locating Elements Location Methods: find_element_by_id find_element_by_name find_element_by_xpath fi ...
- 【原创】Java基础之Freemarker(1)模板加载及清空机制
一 freemarker加载模版机制 freemarker中的配置项template_update_delay表明模版的缓存时间,单位是s,超过缓存时间则从磁盘加载最新的模版,具体细节如下: 1)fr ...
- vue.js过滤器
import Vue from 'vue' import { ENV } from '@/config/conf' const dateFormat = (str) => { var date ...
- iOS 中的特殊字面量表示方法
转义字符\0(空字符).\\(反斜线).\t(水平制表符).\n(换行符).\r(回车符).\"(双引号).\‘(单引号).单字节 Unicode 标量,写成\xnn,其中nn为两位十六进制 ...
- SlopeOne
相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上 我们需要同样的一种替代物,如果简简单单的在数据库 ...
- unity 如何在botton AddListen中传递参数调用函数
使用Deleget方法包含该函数即可. levelItem.GetComponent<Toggle().onValueChanged.AddListener(SetSelectedLevel(l ...
- intellij idea创建maven项目
1.安装好JDK,Tomcat,安装好maven: 2.配置maven全局变量:file->Other Settings ->Default Settings->Build,Exec ...
- Windows Internals 笔记——CreateProcess
1.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.然后系统为新进程的主线程创建一个线程内核对象(使其计数为1). 2.CreateProcess在进程完全初 ...