OO第三阶段总结

规格化设计调研

发展历史

20世纪60年代,软件设计出现危机,并且在这时候产生了结构化程序设计方法,随着更大容量,更高速度的计算机的出现,计算机的应用范围也迅速扩大,结构化的程序设计开始无法满足用户的需求,面向对象程序设计应运而生。

重视原因

对于具有复杂需求的项目:

  1. 功能的变化与迭代速度快,需要较高的研发效率,
  2. 多人协作研发需要信息的正确传递与理解
  3. 需要良好的可移植性与可扩展性

规格Bug表格分析

Bug编号

Bug类别

类别名

方法名

行数

1

不符合JSF规范

ReqQueue

add

28

2

不符合JSF规范

Map

getMap

229

3

不符合JSF规范

Map

changeState

264

4

不符合JSF规范

Map

state

278

5

不符合JSF规范

LightMap

getLight

177

6

EFFECTS逻辑错误

UpdateFlow

run

12

7

EFFECTS逻辑错误

Light

getLight

177

 

 

 

 

 

 

规格Bug产生原因

Bug编号

产生原因

1

synchronized方法未加相应的线程控制说明

2

线程控制说明理解错误

3

线程控制说明理解错误

4

线程控制说明理解错误

5

synchronized方法未加相应的线程控制说明

6

JSF写错位置

7

EFFECTS为布尔表达式,” esult==”而非” esult=”

 

 

 

 

 

Bug在方法上的聚焦关系

方法名

功能Bug数

规格Bug数

add

0

1

getMap

0

1

changeState

0

1

state

0

1

getLight

0

2

run

0

1

add

0

1

 

 

不好的前置条件写法及改正

1.使用自然语言:
/**
@REQUIRES:gui不为空
*/
改正:
/**
*@REQUIRES:gui!=null;
*/
2.前置条件不为布尔表达式“
/**
*@REQUIRES: 0<=x<=79;
*           0<=y<=79;
*/ 
改正:
/**
*@REQUIRES: 0<=x<=79 && 0<=y<=79;
*/              
3.构造方法参数没有约束:
public LightMap(TaxiGUI gui,Map map) {
/**
*@REQUIRES:None;
*/ } 改正: public LightMap(TaxiGUI gui,Map map) { /** *@REQUIRES:map!=null && gui!=null;
*/ }
4.缺少对数字范围判断:
public boolean waitpass(int x,int y) {
/**
*@REQUIRES:None;
*/
}
改正:
public boolean waitpass(int x,int y) {
/**
*@REQUIRES:0<=x<=79 && 0<=y<=79;
*/
}
5.参数约束不全:
public void setflow(int x1,int y1,int value){
/**
*@REQUIRES:0<=x1<=79 && 0<=y1<=79;
*/
}
改正:
public void setflow(int x1,int y1,int value){
/**
*@REQUIRES:0<=x1<=79 && 0<=y1<=79 && 0<=value<=1000;
*/
}

不好的后置条件写法及改正

1.线程控制未加锁:
public synchronized int state() {
/**
*@EFFECTS:
*    
esult==state;
*/     
}
改正:
public synchronized int state() {
/**
*@EFFECTS:
*    
esult==state;
* @THREAD_REQUIRES:
*      locked();
* @THREAD_EFFECTS:
*      locked(	his);
*/     
}
2.后置条件不为布尔表达式:
public int demens(int x,int y) {
/**
*@EFFECTS:
*        
esult=x*80+y;
*/
}
改正:
public int demens(int x,int y) {
/**
*@EFFECTS:
*        
esult==x*80+y;
*/
}
3.后置条件不全面:
public Map(TaxiGUI gui) throws FileNotFoundException {
/** 
*@EFFECTS:
*    	his.flow==flow;
*    	his.map==map;
*    	his.gui==gui;
*/
}
改正:
public Map(TaxiGUI gui) throws FileNotFoundException {
/** 
*@EFFECTSS:
*    	his.flow==flow;
*    	his.map==map;
*    	his.gui==gui;
*    	his.name==name;
*/
}
        
4.使用自然语言:
public int demens(int x,int y) {
/**
*@EFFECTS:
*   返回x*80+y;
*/
    return x*80+y;
}
改正:
public int demens(int x,int y) {
/**
*@EFFECTS:
*   
esult=x*80+y;
*/
    return x*80+y;
}
5.出现如果--否则语句描述:
public boolean repOK() {
/** 
* @EFFECTS:
*     (map==null)==>
esult=false;
*      else ==>
esult=true;
*/ 
    if(lightmap==null ) return false;
    return true;        
}
改正:
public boolean repOK() {
/** 
* @EFFECTS:
*      
esult==!(map==null);
*/ 
    if(lightmap==null ) return false;
    return true;        
}

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

在撰写规格时主要会根据方法的输入参数以及输出结果出发进行设计,参数的限制作为前置条件,忽略算法的具体实现,关注外部参数的变化和输出结果,EFFECTS书写需要简洁且全面。在书写规格的过程中,对于各类方法的分析不够全面且清晰,对于参数的限制条件书写较为简单,但是某些方法需要凝练为布尔表达式并不容易;后置条件可能需要一些自然语言作为支撑,并且由于方法行数较长,修改的外部参数过多,书写起来比较冗长。由于自己是先完成了方法,才书写相应的规格,所以。。。

 

 

 

原文地址:https://www.cnblogs.com/sbs384/p/9112410.html