第九到十一次作业总结

一、规格化设计的大致发展历史

这里说到的规格化设计就是将程序进行结构化分析的表现方式。结构化分析在1980年代起开始广为使用。结构化分析包括将系统概念转换为用数据及控制的来表示。数据字典用来描述数据和指令的流动,而用程序规格来描述交易或数据转换的相关信息。结构化分析是许多结构化方法中的一部分。“结构化分析是系统分析、设计及编程技术的组合,其目的是为了处理1960至1980年软件开发所遇到的问题,也没有将需求及设计文件化的技术。但是随着系统越来越大也更加复杂,信息系统的发展也变得越来越困难。”为了方便管理大而复杂的系统,慢慢演进了更多的结构化方法。80年代后,面向对象的设计兴起,相比于单纯的结构化设计,面向对象的设计从审视问题的角度上就有了差异,程序发生了从围绕“行为”执行到围绕“客体”执行的变化,随之而来的,就是封装性地提高,可重用性的提高,可以说,面向对象进一步实现了结构化设计,是结构化设计更进一步的实现。

规格化设计的重要性就在于,可以让软件设计者和真正写程序的人员之间进行有效的沟通。因为用自然语言进行交流总是会发生歧义,导致交流和沟通不便。只有双方维持着同一套系统的,高效的语言,才能真正发挥规格化设计的作用。

 

二、规格bug

modifies不完整 方法代码行数:150
不符合JSF规范 方法代码行数:1
overview是否明确抽象 类代码行数:162

三、规格bug的产生原因

1、overview的问题是因为忘记撰写

2、不符合JSF规范是因为在遍历集合元素时,误把分号写作冒号

3、modifies不完整是因为成员变量没有加this.

四、分别列举5个前置条件和5个后置条件的不好写法,并给出改进写法

REQUIRES:

(1)*@REQUIRES:String类型的地图路径,System.in。改:*@REQUIRES:path!=null;

(2)在方法的传入参数有限制的时候,*@REQUIRES:None;改:**!=null;

(3)传入参数涉及坐标时:int sx, int sy, int dx, int dy,*@REQUIRES:None; 改:@REQUIRES: 0<=sx<80&&0<=sy<80&&0<=dx<80&&0<=dy<80

(4)get类的方法中,待返回的值不加以约束,*@REQUIRES:None;改:this.*!=null;

(5)构造方法中,对传入的参数不进行约束,*@REQUIRES:None;改:**!=null;

EFFECTS:

(1)自然语言撰写。*@EFFECTS:查询是否重复;改:*@EFFECTS:n.exists==>(\result==true);!n.exists==>(\result==false);

(2)对异常的处理不明确。(Unknown situation)==>exceptional_behavior(Exception);改:(I/O error occurs)==>exceptional_behavior (IOException);

(3)涉及算法。(graph[sx*80+sy][dx*80+dy]==1)?true:false;改:

* @EFFECTS: (road.open)==>(\result==true);

* (road.close)==>(\result==false);

改:

(4)使用synchronized关键字没有进行线程约束。改:

* @THREAD_REQUIRES: \locked(this);

* @THREAD_EFFECTS: \locked(this);

(5)出现恒等式:

* @EFFECTS: requestQueue == requestQueue;

* cars == cars;

* taxiGUI == taxiGUI;

改:

* @EFFECTS:this.requestQueue == requestQueue;

* this.cars == cars;

* this.taxiGUI == taxiGUI;

五、功能bug与规格bug在方法上的聚集关系

方法名 功能bug 规格bug
pathlength 1个(搜索算法效率低) 1个

TargetChange

1个(红绿灯时间差异) 1个
noTargetChange 1个(流量最小的控制) 1个

在上述三个较为重要的方法中,实现的功能较多,因此而产生的bug会比较集中,也正因为实现功能较多,会导致规格的撰写较为冗长,也更容易出现错误。

六、设计规格和撰写规格的基本思路和体会

在撰写规格时,我关注的是这个方法究竟改变了什么,以modifies为纲,不去在乎具体的算法,而是在这个方法实现之后,我的程序应该进行到什么程度,改变了什么,返回值是什么。在撰写过程中,有些方法的篇幅较长,改变的东西较多,理清所有的内容需要较长的时间而且写出来的规格也较多较杂。唯一能解决的办法就是,在这个方法中继续拆分出更小的函数单元,分别撰写规格。因为,这几次的作业都是完成一个工程,我们需要从一砖一瓦开始搭建,当有了一个详细的设计图(规格)之后,整个建筑的搭建就会容易很多。在以后的学习中就要学会先进行规格的设计,明确每个类,每个方法的作用,使这个过程不再是零碎的,而是成体系的,有顺序的。

posted @ 2018-05-30 11:34  melina  阅读(143)  评论(0编辑  收藏  举报