OO第三次博客作业(2018春)

写在前面

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我就直接用自然语言描述了

  



猜你喜欢

转载自www.cnblogs.com/wjy12138/p/9105389.html