一、规格化设计的大致发展历史
这里说到的规格化设计就是将程序进行结构化分析的表现方式。结构化分析在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==>( esult==true);!n.exists==>( esult==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)==>( esult==true);
* (road.close)==>( esult==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为纲,不去在乎具体的算法,而是在这个方法实现之后,我的程序应该进行到什么程度,改变了什么,返回值是什么。在撰写过程中,有些方法的篇幅较长,改变的东西较多,理清所有的内容需要较长的时间而且写出来的规格也较多较杂。唯一能解决的办法就是,在这个方法中继续拆分出更小的函数单元,分别撰写规格。因为,这几次的作业都是完成一个工程,我们需要从一砖一瓦开始搭建,当有了一个详细的设计图(规格)之后,整个建筑的搭建就会容易很多。在以后的学习中就要学会先进行规格的设计,明确每个类,每个方法的作用,使这个过程不再是零碎的,而是成体系的,有顺序的。