写在前面
oo终于终于终于不用敲代码了!
规格化调研
软件的形式化、规格化方法起步于程序理论和语义的研究,历经50余年的发展,成为了计算机科学的重要领域,它使用严格的数学方法,研究并发展软件系统的建模、设计、开发、验证与演化等技术,为保证系统的正确性、可靠性和安全性提供了重要途径。软件形式化方法最早可追溯到20世纪50年代,J.Backus提出BNF描述Algol60语言的语法,出现了各 种语法分析程序自动生成器以及语法制导的编译方法,使得编译系统的开发从“手工艺制作方式”发展成具有牢固理论基础的系统方法。形式化方法的研究高潮始于 20世纪60年代后期,针对当时所谓“软件危机”,人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织、管理软件的开发过程;二是深入探讨程 序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践。前者导致“软件工程”的出现和发展,后者则推动了形式化方法的深入研究。经50多年的研究和应用,如今人们在形式化方法这一领域取得了大量、重要的成果,从早期最简单的形式化方法——一阶谓词演算方法到现在的应用于不同领域、不同阶段 的基于逻辑、状态机、网络、进程代数、代数等众多形式化方法。形式化方法的发展趋势逐渐融入软件开发过程的各个阶段,从需求分析、功能描述(规约)、(体 系结构/算法)设计、编程、测试直至维护。
软件的规格化是提高软件可靠性的重要方式之一,当软件的规模随着软件行业的成熟和发展,软件系统的复杂性使得错误出现几率大幅度提升,这个问题的解决也日益困难。许多研究者在这个领域提出了各种规格化方法。规格化方法是基于数学的技术,这些技术通常由推理工具支持,提供了一个严格的、有效的方式去建模、设计和分析计算机系统。
规格BUG
(规格bug对应方法的代码行数为对应括号里的数字)
Requires不完整 | Modifies不完整 | Effects不完整 | Requires逻辑错误 | Modifies逻辑错误 | Effects逻辑错误 | Effects为实现算法 | JSF不符合规范 | 总规格bug数量 | ||
第9次 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
第10次 | 0 | 0 | 0 | 0 | 0 | 3(121;61;41) | 3(35;38;36) | 0 | 6 | |
第11次 | 0 | 0 | 0 | 0 | 0 | 0 | 3(35;38;36) | 1(类规格bug) | 4 |
第10次:6个bug分成两类,一类是effects里没写exceptional_behavior的内容,另一类是effects里是用汉语描述的实现算法。
第11次:4个规格bug中有3个是第十次中未修改的effects里是用汉语描述的实现算法,有一个是出租车子类的类规格里没有写@ INHERIT。
BUG分析
功能bug | 规格bug | |
第9次 | 0 | 0 |
第10次 | 2(loadfile; run) | 6(loadfile;run;fill_lightInfo; road_break; getDerection; hang) |
第11次 | 2(loadfile; road_break; ) | 4 (road_break; getDerection; hang) |
规格bug分析如上
功能bug主要为:
1.loadfile后部分出租车不能出现在规定的坐标
2.可追踪出租车有时遇到关闭道路会绕路走
5个前置条件和5个后置条件
前置条件:
1. 0<=id<100;gui!=null; Graph!=null;
没有写成一个布尔表达式
修改:0<=id<100&&gui!=null&&Graph!=null;
2.arrlist!=null;
对于对象数组, 应判断数组中每个对象也不为空
修改:(arrlist!= null) && (\all i in arrlist; arrlist [i ]!= null)
3. x < 6400;
坐标值应大于0
修改:0 <= x < 6400;
4.\exist String filepath
尽量不用自然语言
修改:File filepath.exists()==true;
5 None;
有一个构造器的require内容为none
修改:al!=null&&AL!=null;
后置条件:
1.@EFFECTS:双向迭代器的后续/前序遍历;
effects纯语言描述
修改:\result == this.AL.Iterator();
2.@ EFFECTS
@和effects之间应该没有空格
修改:@EFFECTS
3.@EFFECTS:
normal_behavior:
initial lightInfo(初始化红绿灯信息矩阵);
exceptional_behavior (IOException);
exceptional_behavior里没写内容
修改:在exceptional_behavior里写上内容
4.
@EFFECTS: src = new Point(x1,y1);dst = new Point(x2,y2);time = t;
赋值要用 ==
修改:@EFFECTS: src = new Point(x1,y1);dst = new Point(x2,y2);time = t;
5.\return == this.G;
关键字错误
\result == this.G;
心得体会
oo写到现在,基本所有敲代码的工作都结束了。这三次作业中,第9次相比较起来费时间一点,整个出租车调度系统从设计到实现都要一点一点搞;其他两次相对轻松一些,只是添加新功能,但是但是但是写规格真的是一件很头疼的事情。关于规格的书写,对我自己来说,那些代码行数多的方法写起来不太容易,容易陷入到描述方法如何实现的错误里,我对jsf的理解还是不太到位。
我在设计规格和撰写规格的基本思路大概是:
Requires:观察传进来的参数是否有前提条件限制,若没有前置条件为None
Modifies:观察这个方法里用到了类的哪那些属性,这些属性会不会在方法调用后被改变
Effects:观察这个方法里用到了类的哪那些属性,这些属性会不会在方法调用后被改变,若会改变,被改变成了什么;观察return的内容;太抽象的方法的effects我就直接用自然语言描述了