标签:idt 返回 撰写 输入参数 file 研发 不为 结构 effect
规格化设计调研
发展历史
20世纪60年代,软件设计出现危机,并且在这时候产生了结构化程序设计方法,随着更大容量,更高速度的计算机的出现,计算机的应用范围也迅速扩大,结构化的程序设计开始无法满足用户的需求,面向对象程序设计应运而生。
重视原因
对于具有复杂需求的项目:
规格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为布尔表达式,”\result==”而非”\result=” |
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: * \result==state; */ } 改正: public synchronized int state() { /** *@EFFECTS: * \result==state; * @THREAD_REQUIRES: * \locked(); * @THREAD_EFFECTS: * \locked(\this); */ }
2.后置条件不为布尔表达式: public int demens(int x,int y) { /** *@EFFECTS: * \result=x*80+y; */ } 改正: public int demens(int x,int y) { /** *@EFFECTS: * \result==x*80+y; */ }
3.后置条件不全面: public Map(TaxiGUI gui) throws FileNotFoundException { /** *@EFFECTS: * \this.flow==flow; * \this.map==map; * \this.gui==gui; */ } 改正: public Map(TaxiGUI gui) throws FileNotFoundException { /** *@EFFECTSS: * \this.flow==flow; * \this.map==map; * \this.gui==gui; * \this.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: * \result=x*80+y; */ return x*80+y; }
5.出现如果--否则语句描述: public boolean repOK() { /** * @EFFECTS: * (map==null)==>\result=false; * else ==>\result=true; */ if(lightmap==null ) return false; return true; } 改正: public boolean repOK() { /** * @EFFECTS: * \result==!(map==null); */ if(lightmap==null ) return false; return true; }
设计规格和撰写规格的基本思路和体会
在撰写规格时主要会根据方法的输入参数以及输出结果出发进行设计,参数的限制作为前置条件,忽略算法的具体实现,关注外部参数的变化和输出结果,EFFECTS书写需要简洁且全面。在书写规格的过程中,对于各类方法的分析不够全面且清晰,对于参数的限制条件书写较为简单,但是某些方法需要凝练为布尔表达式并不容易;后置条件可能需要一些自然语言作为支撑,并且由于方法行数较长,修改的外部参数过多,书写起来比较冗长。由于自己是先完成了方法,才书写相应的规格,所以。。。
标签:idt 返回 撰写 输入参数 file 研发 不为 结构 effect
原文地址:https://www.cnblogs.com/sbs384/p/9112410.html