OO第三次博客作业

OO的代码作业到这里要告一段落了,以后可以少熬夜多睡觉了,撒花~~~

一、调研

(1)总结介绍规格化设计的大致发展历史

  ->落后的软件生产方式无法满足迅速增长的计算机软件需求,软件的开发与维护出现一系列严重问题。

  ->由此提出结构化程序设计,以模块化设计为中心,分而治之,引出了规格化抽象。

  ->软件系统日趋复杂,结构化程序设计的缺点日渐暴露出来,面向对象由此产生,规格化设计进一步发展。

  ->设计模式、设计原则、架构模式的产生。

(2)为什么得到了人们的重视

  因为OO这门课的要求,不写会被扣很多分

  规格化的书写和设计有助于程序员理解程序、分解程序,独立化开发任务、加快开发速度,有助于程序在细节和整体上进行验证,以保证程序的正确性,提高程序未来的可维护性、可扩展性。当在团队开发时,规格化的设计更有利于团队中的人相互理解。

二、分析bug

  • 第九次作业

  没有功能bug和规格bug

  • 第十次作业

  功能bug:

  规格bug:

  • 第十一次作业

  没有规格bug

三、分析自己规格bug产生的原因

  课下发放的JSF示例并不能完全解决我们对于规格的理解,所以在编写程序规格时难免出现一些问题,归结原因还是不熟练以及缺乏类似的思想。

四、列举不好的写法并给出改进写法

  boolean getflag() {
        /**
         * @REQUIRES: None
         * @MODIFIES: None
         * @EFFECTS:  \result == flag;
         */
        return flag;
  }
-------------------------------------------------------------------------------------------
改进:
        /**
         * @EFFECTS:  \result == flag;
         */    
  synchronized void driving(int i) {//有目的行驶
        /**
         * @REQUIRES:None;
         * @MODIFIES:
         *      \this.newlocation;
         * @EFFECTS:
         *      首先更新last,然后根据输入更新location
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */
        if (i == 1) newlocation = location - 80;
        else if (i == 2) newlocation = location + 80;
        else if (i == 3) newlocation = location - 1;
        else if (i == 4) newlocation = location + 1;
  }
--------------------------------------------------------------------------------------------
改进:
        /**
         * @REQUIRES:1 <= i <= 4;
         * @MODIFIES:
         *      \this.newlocation;
         * @EFFECTS:
         *      (i == 1) ==> (\this.newlocation == \this.location - 80);
         *      (i == 2) ==> (\this.newlocation == \this.location + 80);
         *      (i == 3) ==> (\this.newlocation == \this.location - 1);
         *      (i == 4) ==> (\this.newlocation == \this.location + 1);
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */
    

 

    synchronized boolean checkconnected(int newLocation) {//检测道路连通性
        /**
         * @REQUIRES:None;
         * @MODIFIES:None;
         * @EFFECTS:
         *      \all int next;next belongs to map.edges[location] && next!=newLocation;
         *              \result==false;
         *      \exists int next;next belongs to map.edges[location] && next==newLocation;
         *              \result==true;
         */
        Vector<Integer> temp = map.edges[location];
        for (int next : temp){
            if (next == newLocation) return true;
        }
        return false;
    }
--------------------------------------------------------------------------------------------
改进:
        /**
         * @REQUIRES:0 <= newLocation <= 6399;
         * @MODIFIES:None;
         * @EFFECTS:
         *      (\all int next;next belongs to map.edges[location] && next!=newLocation) ==> (\result==false);
         *      (\exists int next;next belongs to map.edges[location] && next==newLocation ==> (\result==true);
         */    

 

    synchronized void addflow(int start, int end) {
        /**
         * @REQUIRES:
         *      0<=start<=6399;
         *      0<= end <=6399;
         * @MODIFIES:
         *      \this.flow;
         * @EFFECTS:
         *      如果start与end邻接,则
         *          \this.flow[start][end]++;
         *          \this.flow[end][start]++;
         *      否则不做任何操作
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */
        if(edges[start].contains(end)) {
            int dx = Math.abs(start/80-end/80);
            int dy = Math.abs((start-end)%80);
            if ((dx == 1 && dy == 0) || (dx == 0 && dy == 1)) {
                flow[start][end]++;
                flow[end][start]++;
            }
        }
    }
----------------------------------------------------------------------------------------
改进:
        /**
         * @REQUIRES:
         *      0<=start<=6399;
         *      0<= end <=6399;
         * @MODIFIES:
         *      \this.flow;
         * @EFFECTS:
         *      (edges[start].contains(end)) ==>
         *          \this.flow[start][end]++ &&
         *          \this.flow[end][start]++;
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */

 

    synchronized void setflow(int start, int end, int value) {
        /**
         * @REQUIRES:
         *      None;
         * @MODIFIES:
         *      \this.flow;
         * @EFFECTS:
         *          \this.flow[start][end] == value;
         *          \this.flow[end][start] == value;
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */
        flow[start][end] = value;
        flow[end][start] = value;
    }
--------------------------------------------------------------------------------------------
改进:
        /**
         * @REQUIRES:
         *      0<=start<=6399;
         *      0<= end <=6399;
         *      0<= value <=100;
         * @MODIFIES:
         *      \this.flow;
         * @EFFECTS:
         *          \this.flow[start][end] == value;
         *          \this.flow[end][start] == value;
         * @THREAD_REQUIRES:
         *      \locked(\this);
         * @THREAD_EFFECTS:
         *      \locked();
         */

 

五、功能bug与规格bug在方法上的聚集关系

  根据上述对作业bug的分析,功能bug和规格bug没有什么聚集关系,但是这种情况出现的原因主要是是先写完的代码才写的规格,导致两个描述可能不太一致,但是从整个程序的设计来考虑,当一个方法的规格复杂时,必然需要更多的篇幅和代码来进行实现,出现bug的几率也会越大。

六、归纳自己在设计规格和撰写规格的基本思路和体会

  由于并不是在一开始写代码就书写规格,而是在写完代码以后才补充规格,导致我觉得这几次的规格书写没什么用,反而还让我陷入了因为要补写规格所以debug的时间大大减少程序bug增多的僵局。不过从长远来看,规格训练是必要的,根据规格书写代码确实能减少写代码过程中的很多问题。这个也确实还需要练习。

  佛系oo挺好的,拿不出真凭实据从gui上找错报别人一堆bug,申诉没说两句话就“有什么问题直接仲裁吧”。我六系同学最需要学习的不是怎么写代码,是怎么和别人沟通和交流,这个课的互测阶段真的把我的好脾气耗尽了...

 

posted @ 2018-05-28 19:16  QMMM  阅读(176)  评论(0编辑  收藏  举报