OO第三次博客
规格化设计的发展历史
在计算机的早期发展中,软件开发没有可以遵循的系统方法,往往只有源代码而没有软件说明书等文档,因此这段时期的软件通用性时很有限的。后来到了20世纪60年代,软件开始被广泛使用,软件开发依然没有规范化,而软件的需求也越来越复杂,使得程序维护难度大大增加。为了解决这一难题,人们认真思考后形成了新的程序开发要求:即程序除了拥有良好的性能和正常的功能外,还应该具有良好的可读性的可拓展性,并易于后期的维护。1968年北约软件工程大会上提出来软件工程的概念。之后普遍开始关注软件开发过程的研究,在这期间确定了一系列重要的文档规范,这些规范在后来的发展中形成了软件开发之中的规格化设计。
规格化设计作为一种契约化编程手段,它要求开发者使用抽象和规格的方法设计程序,保证了程序的易维护性、高效性以及可拓展性,对于大型的软件开发大有裨益,因此受到了人们的重视。
作业BUG分析
三次作业都没有被报规格bug。
五个不好的前置条件和后置条件写法以及改进
1 五个不好的前置条件写法以及改进:
a)前置条件考虑不充分,未对allTaxi数组内元素加以限制。
Input(Queue reqs,TaxiGUI gui,Map map,Taxi[]allTaxi){
/**
* @REQUIRES:
* reqs!=null;
* gui!=null;
* map!=null;
* allTaxi!=null;
改进写法:
Input(Queue reqs,TaxiGUI gui,Map map,Taxi[]allTaxi){
/**
* @REQUIRES:
* reqs!=null;
* gui!=null;
* map!=null;
* allTaxi!=null;
* (\all int i;0<=i<=99;allTaxi[i]!=null);
b)使用自然语言。
public void openFile(String name) {
/**
* @REQUIRES:文件存在
改进写法:
public void openFile(String name) {
/**
* @REQUIRES:FILE(name).exists==true;
c)未对参数取值范围加以限制。
synchronized void setStatus(int status) {
/**
* @REQUIRES:status!=null;
改进写法:
synchronized void setStatus(int status) {
/**
* @REQUIRES:status!=null;
* status==0||status==1||status==2||status==3;
d)未考虑数组为null的情况。
synchronized Request removeFirst() {
/**
* @REQUIRES:None;
改进写法:
synchronized Request removeF() {
/**
* @REQUIRES:this.reqQueue!=null;
e)冗余的前置条件(方法内对文件路径不存在的情况作了相应的处理,因此不必再前置条件中加以限制)。
public void mapLoader(String fileName) {
/**
* @REQUIRES:File(fileName).exist;
改进写法:
public void loading(String fileName) {
/**
* @REQUIRES:None;
2 五个不好的后置条件写法以及改进:
a)使用自然语言。
public static void fileWriter(String file,String str){
/**
* @REQUIRES:
* file!=null;
* File(file).exist;
* @MODIFIED: File(file);
* @EFFECTS: write str to end of File(file);
*/
改进写法:
public static void fileIn(String fileName,String str){//写字符串str写到文件File(fileName)中
/**
* @REQUIRES:
* File(fileName).exist==true;
* @MODIFIED: File(fileName);
* @EFFECTS: File(fileName)!=\old(File(fileName));
*/
b)后置条件为布尔表达式,不应用‘=’。
public boolean getArrived(){
/**
* @REQUIRES:None;
* @MODIFIES:None;
* @EFFECTS:\result=this.arrived;
*/
改进写法:
public boolean getArrived(){
/**
* @REQUIRES:None;
* @MODIFIES:None;
* @EFFECTS:\result==this.arrived;
*/
c)后置条件表述不清晰。
void setReachable() {
/**
* @REQUIRES:
* map!=null;
* @MODIFIES:
* \this.reachable;
* @EFFECTS:
* (\all point p;point q.reaches(q)||p.reaches(q);reachable[p.x][p.y].contains(q);
*/
改进写法:
void setReachable() {
/**
* @REQUIRES:
* map!=null;
* @MODIFIES:
* \this.reachable;
* @EFFECTS:
* (\all point p,q;q.reaches(q)==true&&p.reaches(q)==true;reachable[p.x][p.y].contains(q)==true
* &&reachable[q.x][q.y].contains(p)==true;
*/
d)使用自然语言。
String SPFA(point src,point des,Vector<point>[][] reachable) {
/**
* @REQUIRES:src!=null&&src.inMap==true;
* des!=null&&des.inMap==true;
* @MODIFIES: None;
* @EFFECTS:\result==String(shortest path from src to des);
*/
改进写法:
String SPFA(point src,point des,Vector<point>[][] reachable) {
/**
* @REQUIRES:src!=null&&src.inMap;
* des!=null&&des.inMap;
* @MODIFIES: None;
* @EFFECTS:\result!=null&&\result.length()>=0;
*/
e)未书写exception_behavior。
void initMap(String name,TaxiGUI gui) {
/**
* @REQUIRES:
* name!=null;
* gui!=null;
* File(filename).exist;
* @MODIFIES:
* \this.map;
* \this.numMap;
* @EFFECTS:
* \all int i;0<=i<80;this.map[i]==readLine(name);
* !MapReadSucceed==>output error information
*/
改进写法:
void initMap(String name,TaxiGUI gui) {
/**
* @REQUIRES:
* name!=null;
* gui!=null;
* File(filename).exist;
* @MODIFIES:
* \this.map;
* @EFFECTS:normal_behavior
* \all int i;0<=i<80;this.map[i]==readLine(name);
* !MapReadSucceed==>exceptional_behavior (WrongFormatException);
*/
聚焦关系
由于部分规格是在代码实现后才书写的,所以在我的这三次作业中,功能bug和规格bug没有聚集关系。
心得体会
在书写规格前,我会先思考方法需要实现的功能,之后再分析方法调用时默认满足的条件、用户能够感觉到的数据修改以及执行后系统满足的状态,最后将这些信息体现在规格中。
良好的规格给我们阅读代码提供了便利,提高了代码的可读性,使得bug的定位以及后期的代码重构不那么复杂。在写规格的过程中,能够理清思路,减少了因为逻辑错乱而产生的bug,达到事半功倍的效果。这几次作业中我写出的代码规格依然存在表意不明,逻辑不清等问题,所以在以后的代码书写中,我还应该对代码的规格书写多加练习。
OO第三次博客的更多相关文章
- [BUAA OO]第三次博客作业
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...
- OO第三次博客作业——规格
OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...
- OO第三次博客作业---透过代码看设计
不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...
- 渡过OO的死劫,了解规格的意义——OO第三次博客总结
当熬过了一次次黑暗,迎接我们的却是被扣的惨不忍睹的JSF ┭┮﹏┭┮ 一.总结调研 规格的历史 传统科学的特点是发现世界,而软件的特点是构造世界.软件的最底层就是0,1,两个离散的值.程序设计语言的三 ...
- 2019年北航OO第三次博客总结
一.JML语言理论基础及其工具链 1. JML语言理论基础 JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言(Behavior Interface Specificati ...
- OO第三次博客作业
一.规格化的发展历史 最早的程序设计都是面向机器,从一开始使用的机器语言,到后面的汇编语言,都是面向机器的语言,编写困难也容易出错.随着需求的发展,程序的编写从面向机器走向面向过程,但由于goto语句 ...
- OO第三次博客总结
一. 规格发展历史 从20世纪60年代开始,就存在着许多不同的形式规格说明语言和软件开发方法.在形式规格说明领域一些最主要的发展过程列举如下: 1969-1972 C.A.R Hoare撰写了&quo ...
- OO 第三次博客总结
调研规格化设计 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化编程,实现最初的代码重用.产生基本的软件开发过程:分析—设计—编码—测 ...
- oo第三单元博客作业
JML语言理论基础 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,他鼓励你用一种全新的方式来看待Java的类和方法.JML是一种行为接口规格语言 ...
随机推荐
- 卷积神经网络特征图可视化(自定义网络和VGG网络)
借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么. 自定义网络特征可视化 代码: # coding: utf-8 from keras.m ...
- DW/BI领域的自动化调度方案
1,利用专用自动化工具:如Tidal,Ctrl-M,Jenkins等.特点是功能强大,可以调用各种平台程序,脚本,可以设置依赖关系,调度时间,可以监控运行状态,发送邮件. 2,利用工具自身携带的调度功 ...
- 12集合(1)-----List
一.总体分类 Collection(包括方法add,remove,contains,clear,size) List(接口) LinkedList ArrayList Vector---Stack 2 ...
- 1945 : 卡贩子Carol
题目描述 来自F星球的Carol是一个不折不扣的“正版游戏受害者”,在黑色星期五的疯狂购买后,钱包渐空的Carol突然发现TA所使用的游戏交易平台上有个值得留意的地方————集换式卡牌. 集换式卡牌是 ...
- js立即执行函数用法
js立即执行函数可以让你的函数在创建后立即执行,js立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行. 一.JS立即执行 ...
- Python学习笔记–Chapter 2
1.字符串中添加制表符,可使用字符组合\t 2.字符串中添加换行符,可使用字符组合\n 3.字符串\n\t可以换到下一行,并且在开头添加一个制表符. 4.删除末尾空白,使用方法rstrip() 5.删 ...
- 可持久化trie学习笔记
其实很早之前就想学习可持久化trie,不过由于换队友等情况,还是优先去学数论和计算几何,今天突然心血来潮学了一发可持久化trie,感觉还是蛮简单的,不过由于自己很长时间没写过可持久化了,都快忘了是个什 ...
- [R] [Johns Hopkins] R Programming 作業 Week 2 - Air Pollution
Introduction For this first programming assignment you will write three functions that are meant to ...
- golang-http-post
func httpPost() { resp, err := http.Post("https://www.abcd123.top/api/v1/login", "app ...
- git 远程分支回滚
git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id ...