OO第三次博客总结
一、规格化设计的大致发展历史
最初的代码所作用的对象是单独的私人计算机,也就没有了规格化设计的必要。大量语言的新增和软件的不可靠,导致了20世纪60年代爆发的“软件危机”,清晰的自此文档引起了人们的关注。规格化带来了诸多优点,在此后的30年时间里,逐步发展,增强了程序的可读性,更便于进一步修改和移植。规格化的一步步发展,产生了基于逻辑、代数等多种形式的规格说明,为软件的开发和维护带来了巨大便利。
二、 BUG分析
第九次
BUG内容 | BUG类型 | BUG代码行数 | BUG原因 | 方法名 |
输出信息缺少 | ERROR | 20 | LoadFile中叫车请求产生忘了输出 | public void LoadRequest() |
初始出租车为准备服务状态 | ERROR | 20 | 对LoadFIle中初始设置为准备接客的车没有设置乘客的目的地,车辆停止 | public void LoadRequest() |
抢单服务->抢单出租车不是信用最高的车辆 | ERROR | 9 | 没有对车辆credit和流量flow设置最大值,导致被爆int | public Taxi() |
没有规格bug。
第十次
BUG内容 | BUG类型 | BUG代码行数 | BUG原因 | 方法名 |
程序测试->正常功能测试-红绿灯->目前红灯->出租车下一步即将:直行 | ERROR | 40 | 送客车辆在等灯时出现了多次停留 | public void moveToDest() |
程序测试->针对历史版本的回归测试->是否选择流量最少路径 | ERROR | 40 | 对流量的处理有误 | public void analyse_req() |
程序测试->针对历史版本的回归测试->随机行走的时候没有走流量最少的路径 | ERROR | 40 | 流量清除过快 | public void analyse_req() |
程序测试->正常功能测试-红绿灯->红绿灯时间计算有问题 | ERROR | 40 | 检查发现没有按想象中最近要动车辆计算,而是500ms运行一次 | public void analyse_req() |
规格检查->方法规格检查->Effects 不完整 | 规格 | 30 | effects不全 | public void LoadRequest() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 1 | requires不全 | public void set_curPoint() |
聚集关系:无
第十一次
BUG内容 | BUG类型 | BUG代码行数 | BUG原因 | 方法名 |
程序测试->正常功能测试-红绿灯->目前红灯->出租车下一步即将:直行 | ERROR | 40 | 送客车辆在等灯时出现了多次停留 | public void moveToDest() |
规格检查->方法规格检查->Modifies 不完整 | 规格 | 20 | modifies不完整 | public void LoadFlow() |
规格检查->方法规格检查->Modifies 不完整 | 规格 | 10 | modifies不完整 | public boolean startRead() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 30 | requires不完整 | public void readmap() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 1 | requires不完整 | public synchronized Request get_i() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 30 | requires不完整 | public void get_Range() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 20 | requires不完整 | public void addToCallList() |
规格检查->方法规格检查->Requires 不完整 | 规格 | 40 | requires不完整 | public boolean chooseTaxi() |
规格检查->方法规格检查->Modifies 不完整 | 规格 | 60 | modifies不完整 | public void analyse_req() |
规格检查->方法规格检查->Modifies 不完整 | 规格 | 10 | modifies不完整 | public void move_stopping() |
规格检查->方法规格检查->Modifies 不完整 | 规格 | 10 | modifies不完整 | public void move() |
聚集关系:无
规格bug产生原因:很多requires比较隐含,没有想到。此外还有对上一次代码的修改,却没有修改JSF内容,导致被报bug。
三、 不好写法
前置条件:
对传入参数要加以限制:
// 错误 /** * @REQUIRES : None; */ public synchronized Request get_i(int i) { return requestList.get(i); } // 改进 /** * @REQUIRES : i>0; */ public synchronized Request get_i(int i) { return requestList.get(i); }
=和==傻傻分不清楚:
// 错误
/**
* @REQUIRES: x=(xi,xj);0<=xi<80 & 0<=xj<80;
*/
// 改进
/**
* @REQUIRES: x == (xi, xj); 0 <= xi<=80 & 0<=xj<=80;
*/
前置应该为bool表达式:
// 错误 /** * @REQUIRES: index is from 0 to 100; */ public TaxiCar(int index) { this.index = index; } // 改进 /** * @REQUIRES: 0<=index<100; */ public TaxiCar(int index) { this.index = index; }
范围错误:
// 错误 /** * @REQUIRES: n>0 && n<100 */ public void taxiControl(int n) { } // 正确 /** * @REQUIRES: n>=0 && n<100 */ public void taxiControl(int n) { }
优先级错误:
// 错误 /** * @REQUIRES: req != null && index >= 80 || index < 0; */ public Record(Request req, int index) { this.req = req; this.index = index; } // 改进 /** * @REQUIRES: req != null && (index >= 80 || index < 0); */ public Record(Request req, int index) { this.req = req; this.index = index; }
后置条件:
=和==不分:
// 错误 /** * @EFFECTS : \result = Main.time; */ public synchronized long getTime(int num) { return Main.time; } // 改进 /** * @EFFECTS : \result == Main.time; */ public synchronized long getTime(int num) { return Main.time; }
使用自然语言:
// 错误 /* * @EFFECTS: initialize the new Taxi; */ // 改进 /* * \this.num == num; */
未处理抛出的异常:
// 错误
/**
* @EFFECTS: \result == \min a; */ public static int min (int[ ] a) throws NullPointerException, EmptyException // 改进 /**@ EFFECTS: normal_behavior \result == \min a; (a == null) ==> exceptional_behavior (NullPointerException); (a.length == 0) ==> exceptional_behavior (EmptyException); */ public static int min (int[ ] a) throws NullPointerException, EmptyException
后置条件不完整:
// 错误 /** * @EFFECTS : AskList.contains(ask); */ public synchronized void addAsk(Ask ask){ AskList.add(ask); } // 改进 /** * @EFFECTS : AskList.contains(ask) && AskList.size == \old(AskList).size + 1; */ public synchronized void addAsk(Ask ask){ AskList.add(ask); }
格式不正确:
// 错误 /* * @ EFFECTS: (this.map==null||this.map.length==0) \result = false; \result = true; */ public boolean repOK() { } // 改进 /* * @ EFFECTS: (this.map==null||this.map.length==0)==> \result = false; \result = true; */ public boolean repOK() { }
四、 思路和体会
要写好规格就要重新读懂自己写的函数,尤其注意前置条件常常隐含。另外出现对代码的修改时,要及时修改JSF,以免JSF与代码不配套。JSF被扣10分我是很无奈的……