一、 调研
(1)规格化设计的大致发展历史
1950年代,第一次分离,主程序和子程序的分离
程序结构模型是树状模型,子程序可先于主程序编写。
通过使用库函数来简化编程,实现最初的代码重用。
产生基本的软件开发过程:分析—设计—编码—测试,使大型软件系统的开发成为可能。
1975—1980年代,第二次分离,规格说明(Spec)和体(body)的分离
说明是类型定义和操作描述,体是操作的具体实现。(具体的例子就是C++,Java等面向对象语言的类说明与类实现的分离)
解决方案设计只关注说明,实现时引用或者设计体。
体的更改、置换不影响规格说明,保证了可移植性。
支持多机系统,但要同样环境。
此时产生了划时代的面向对象技术。
1995—2000年代,第三次分离,对象使用和对象实现的分离
基于构件开发:
标准化的软件构件如同硬件IC,可插拔,使用者只用外特性,不计内部实现。
Web Services:
软件就是服务。分布式,跨平台,松耦合。
(2)规格化设计为什么得到人们的重视?
规格化设计在单人、短期、一次性项目开发中作用并不明显,但是大量的软件开发项目并不符合以上几个特点。
·对多人开发而言,好的规格设计大大增强代码可读性,便于在程序员之间共享。利于分工协作,从而提高开发效率。
·对长期、非一次性项目而言,规格设计能够减小“遗忘成本”,降低开发人员变动的代价,帮助后来的设计者更好理解函数(方法)作用而忽视具体实现细节,利于后期维护。
二、 被报告的规格bug、原因及其与功能bug间的聚焦关系
在这三次作业中并未被报规格bug(可能因为我的JSF没怎么认真写,所以挑bug也是件难事。。。
三、 改进写法
原代码:
/** * @MODIFIES: None * @MODIFIES: None * @EFFECTS: \result = Info;
*/
改进后:
/** * @REQUIRES: None * @MODIFIES: None * @EFFECTS: \result == Info; */
原代码:
/** * @MODIFIES: fr; * @EFFECTS: fr == nr; */
改进后:
/** * @REQUIRES: nr != null; * @MODIFIES: this; * @EFFECTS: fr == nr; */
原代码:
/** * @REQUIRES: None; * @MODIFIES: this; * @EFFECTS: x == x1 && y == y1 && status == status1; */
改进后:
/** * @REQUIRES: 0 <=x1,y1<80 && 0<=status1<4; * @MODIFIES: this; * @EFFECTS: x == x1 && y == y1 && status == status1; */
原代码:
/** * @REQUIRES: 0<=n<100; * @MODIFIED: this; * @EFFECTS: initialize the Taxi; */
改进后:
/** * @REQUIRES: 0<=n<100; * @MODIFIED: this; * @EFFECTS: this.taxi == taxi.get(n); */
原代码:
/** * @REQUIRES: none; * @MODIFIED: this; * @EFFECTS: * (taxies.size==0) ==> \result==true; * (\exist int i; 0<=i<taxies.size; (taxies.get(n).number>100 || taxies.get(n).number<1)) * ==> (\result==false); */
改进后:
/** * @REQUIRES: none; * @MODIFIED: this; * @EFFECTS: * (taxies.size==0) ==> \result==true; * (\exist int i; 0<=i<taxies.size; (taxies.get(n).number>100 || taxies.get(n).number<1) || * (taxies.get(n).status<0|| taxies.get(n).status>3) ) || (taxies.get(n).credit<0) * ==> (\result==false); */
四、 心得体会
照理来说应该是先写清楚了规格,再根据规格写出实现该规格所描述的代码,但是我还不太能正确地按照要求完成JSF,大多数时候都是先写完代码再回过头来撰写规格,这就与规格书写的要求背道而驰了。不过经过这么多次练习,可以感受到设计规格对于代码书写的好处是显而易见的,JSF的各种要求虽然书写起来比较麻烦,但是规格设计的思想可以在一定程度上对代码进行规范。