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分我是很无奈的……

posted @ 2018-05-30 01:05  Jason103  阅读(133)  评论(0编辑  收藏  举报