面向对象编程第三阶段总结

一、  调研

(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的各种要求虽然书写起来比较麻烦,但是规格设计的思想可以在一定程度上对代码进行规范。

猜你喜欢

转载自www.cnblogs.com/impact0/p/9112174.html