• 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 : 
    esult = Main.time;
        */
        public synchronized long getTime(int num)
        {
            return Main.time;
        }
    // 改进  
            /**
        * @EFFECTS : 
    esult == Main.time;
        */
        public synchronized long getTime(int num)
        {
            return Main.time;
        }   

    使用自然语言:

    // 错误
    /*
    * @EFFECTS: initialize the new Taxi;
    */
    // 改进
    /*
    * 	his.num == num;
    */

    未处理抛出的异常:

    // 错误
      /**
      * @EFFECTS: esult == min a;   */   public static int min (int[ ] a) throws NullPointerException, EmptyException // 改进   /**@ EFFECTS: normal_behavior esult == 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) 
    esult = false;
                        
    esult = true;
         */
        public boolean repOK() {
           
        }
    // 改进
        /*
         *  @ EFFECTS:  (this.map==null||this.map.length==0)==> 
    esult = false;
                        
    esult = true;
         */
        public boolean repOK() {
           
        }

    四、 思路和体会

      要写好规格就要重新读懂自己写的函数,尤其注意前置条件常常隐含。另外出现对代码的修改时,要及时修改JSF,以免JSF与代码不配套。JSF被扣10分我是很无奈的……

  • 相关阅读:
    云南9日游攻略
    移动端和边缘端的深度学习概述
    卷积、反卷积与膨胀卷积
    语义分割简述
    数据结构与算法----2总览
    python 中easydict库解析json文件
    python命令行传参解析(二)------ConfigParser
    plt.imshow与cv2.imshow显示颜色问题
    图卷积GCN
    十、mysql 数据类型
  • 原文地址:https://www.cnblogs.com/bvb1909/p/9108697.html
Copyright © 2020-2023  润新知