zoukankan      html  css  js  c++  java
  • OO第9~11次作业总结

    规格化设计调研

    大致发展历史

    --> 自给自足的私人化的软件生产方式。

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

    --> 正式提出“软件工程”。

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

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

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

    为何得到重视

    1. 有助于程序员理解程序、分解程序,独立化开发任务、加快开发速度。
    2. 有助于团队中的人互相理解代码。
    3. 有助于程序在细节和整体上进行验证,以保证程序的正确性。
    4. 有助于提高程序未来的可维护性、可扩展性。

    三次作业的bug列表分析

    列举几个规格bug并改进 

     前置条件的错误样例及改进

        static int getRandomInRange(int range) {
            /**
             * @REQUIRES : None;
             * @MODIFIES : None;
             * @EFFECTS :
             *         返回一个随机整数,范围从0,1,2...到range-1
             *         
             */
            return (int) (Math.random() * range);
        } 
    
    =============================================================================
    
      static int getRandomInRange(int range) {
            /**
             * @REQUIRES : 
             *         range>0;
             * @MODIFIES : None;
             * @EFFECTS :
             *         返回值为一个随机整数,其范围从0,1,2...到range-1
             *         
             */
            return (int) (Math.random() * range);
        }
        private DIR calDir(MyPoint ptobe) {
            /**
             * @REQUIRES : 
             *         ptobe!=null;
             * @MODIFIES : None;
             * @EFFECTS :
             *         根据传入的目标点,与当前的点相比,判断从目标点在当前点的哪个方向。
             */
            if(ptobe.x==place.x && ptobe.y==place.y+1)
                return DIR.EAST;
            else if(ptobe.x==place.x && ptobe.y==place.y-1)
                return DIR.WEST;
            else if(ptobe.x==place.x+1 && ptobe.y==place.y)
                return DIR.SOUTH;
            else if(ptobe.x==place.x-1 && ptobe.y==place.y)
                return DIR.NORTH;
            return null;
        }
    
    ==============================================================================
    
        private DIR calDir(MyPoint ptobe) {
            /**
             * @REQUIRES : 
             *         ptobe!=null;
             * @MODIFIES : None;
             * @EFFECTS :
             *         若 传入的目的坐标点 ptobe 与 出租车当前所在的位置坐标点 	his.place 为相邻点,则返回值为 ptobe 相对于 	his.place 的方向。
    * 若 ptobe 和 his.place 为不相邻点,则返回值为null。
    */ if(ptobe.x==place.x && ptobe.y==place.y+1) return DIR.EAST; else if(ptobe.x==place.x && ptobe.y==place.y-1) return DIR.WEST; else if(ptobe.x==place.x+1 && ptobe.y==place.y) return DIR.SOUTH; else if(ptobe.x==place.x-1 && ptobe.y==place.y) return DIR.NORTH; return null; }

     后置条件的错误样例及改进

      public Car(int id) {
            /**
             * @REQUIRES : 
             *         0<=id<100;
             * @MODIFIES : 
             *         	his.id;
             *         	his.place;
             *         	his.dir;
             * @EFFECTS :
             *         	his.id == id;
             *         位置place更新为随机的点,其中点的横纵坐标都是属于[0,79]的整数。
             *         初始方向随机为东南西北中的一种。
             */
            try {
                pw = new PrintWriter("car" + id + ".txt", "UTF-8");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            this.id = id;
            place = new MyPoint(RanGen.getRandomInRange(TaxiSys.MAP_LEN), RanGen.getRandomInRange(TaxiSys.MAP_LEN));
            TaxiSys.gui.SetTaxiStatus(id, place.toAwtPoint(), 2);
            int ran = RanGen.getRandomInRange(4);//随机设置初始朝向
            switch(ran) {
                case 0://状态和编号是一一对应的,按从北开始的顺时针方向
                    dir = DIR.NORTH;
                    break;
                case 1:
                    dir = DIR.EAST;
                    break;
                case 2:
                    dir = DIR.SOUTH;
                    break;
                case 3:
                    dir = DIR.WEST;
                    break;
            }
        }
    ===============================================================================
      public Car(int id) { /** * @REQUIRES : * 0<=id<100; * @MODIFIES : * his.id; * his.place; * his.dir;
    * his.pw; * @EFFECTS : * his.id == id; * 位置 his.place为一个随机的点,其中点的横纵坐标都是属于[0,79]的整数; * 初始方向 his.dir为东南西北中的随机的一种;文件写入器 his.pw得到初始化;
    */ try { pw = new PrintWriter("car" + id + ".txt", "UTF-8"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } this.id = id; place = new MyPoint(RanGen.getRandomInRange(TaxiSys.MAP_LEN), RanGen.getRandomInRange(TaxiSys.MAP_LEN)); TaxiSys.gui.SetTaxiStatus(id, place.toAwtPoint(), 2); int ran = RanGen.getRandomInRange(4);//随机设置初始朝向 switch(ran) { case 0://状态和编号是一一对应的,按从北开始的顺时针方向 dir = DIR.NORTH; break; case 1: dir = DIR.EAST; break; case 2: dir = DIR.SOUTH; break; case 3: dir = DIR.WEST; break; } }
    synchronized public void addReq(Request r) {
            /**
             * @REQUIRES : 
             *         r!=null;
             * @MODIFIES : 
             *         	his.q;
             *         	his.req_id;
             * @EFFECTS :
             *      	his.q.size()==old(this).q.size()+1 && 	his.q.contains(r);
             * @THREAD_REQUIRES : None;
             * @THREAD_EFFECTS :
             *      locked();
             */
            q.add(r);
            r.setID(req_id);
            req_id++;
            TaxiSys.gui.RequestTaxi(r.src_p.toAwtPoint(), r.dst_p.toAwtPoint());
        }
    ================================================================================
    synchronized public void addReq(Request r) { /** * @REQUIRES : * r!=null; * @MODIFIES : * his.q; * his.req_id; * @EFFECTS : * his.req_id==old(this).req_id+1; * his.q.size()==old(this).q.size()+1 && his.q.contains(r); * @THREAD_REQUIRES : None; * @THREAD_EFFECTS : * locked(); */ q.add(r); r.setID(req_id); req_id++; TaxiSys.gui.RequestTaxi(r.src_p.toAwtPoint(), r.dst_p.toAwtPoint()); }

    归纳我在设计规格和撰写规格的基本思路和体会

    • 确实没有设计规格之说,我相信大部分人也都是先写代码,然后发现需求改了,然后改代码,然后debug,最后写文档和JSF。所以我觉得这门课比较遗憾没有对同学们进行设计规格的训练。
    • 既然没有设计规格之说,那么撰写规格也就成了复制粘贴并根据套路微调,成了细心、耐心、恒心的比拼。
    • 基本思路:没啥好说的。主要就是(1)掌握课上给的几个例子和模板,对于相似的方法能够套用 或 进行合理地改进创新。(2)锻炼自己的描述能力,如何做到准确地、全面地、逻辑地、无二义性地描述规格。(3)可以进行场景代入:你可以假设自己是团队设计者,写了规格之后,是要把规格交给你的队友去码代码的,这样或许能够更加锻炼你的规格化设计。
    • 不过,以后如果要我们根据需求和框架来设计规格,然后把规格交给团队的其他人去完成代码,怕是也需要另外进行训练吧嘤嘤嘤。
    • 又或者,更积极一点地去想,其实我们在搭框架、写代码的时候,内心就已经给每一个类和方法赋予了比较模糊的规格,因此,更加有意义的事情,不在于撰写规格,而在于搭框架码代码的过程中 展现出的 清晰的逻辑 和 思想的火花 吧,毕竟后者才更接近于 设计 规格。
    • 体会:虽然有学到一些东西,但是所耗时间精力较多,而且效果不佳。回想规格之前的作业,虽然难度大,但我甚是怀念呢。
    • 最后,很感谢一起熬过这段艰难时期的朋友们,现在心里也平静了许多。

    精神突然荒凉,笑容逐渐消失。

    目睹人心险恶,但所幸患难见真情,有友如此足矣。

    得到最大锻炼的,是一颗刚强的心。

    日后何去何从,大家自有论断。

  • 相关阅读:
    再见了,正则表达式
    深入理解 Python 描述符
    并发-ScheduledThreadPoolExecutor
    ScheduledExecutorService用法
    常见限流算法总结
    常见集合类的复杂度
    并发-ConcurrentHashMap 1.7和1.8的区别
    并发-HashMap在jdk1.8也会出现死循环
    并发-Hashmap 1.7和1.8有哪些区别
    并发-HashMap与红黑树-todo
  • 原文地址:https://www.cnblogs.com/jeffan/p/bingoit3.html
Copyright © 2011-2022 走看看