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

    OO第三单元总结来了,主要针对规格化设计展开~

     PART I 规格化设计发展史

    大规模复杂系统开发,需要建立程序设计者和使用者的桥梁(契约关系???),同时保证程序的正确性及减少软件错误。

    >>1950年代——主程序和子程序的分离

    >>1975-1980——规格说明和体的分离

    >>1995-2000——对象使用个对象实现的分离

    规格化设计逐渐得到人们的重视,分析其原因主要有:
    1. 开发者准确实现需求
    2. 团队开发大型工程时,成员正确理解、调用对方代码
    (3. 学校教学时的注重)

    PART2 bug分析
    
    

     PART3 功能bug与规格bug的聚焦关系

    第9次功能bug是车随机行驶会掉头,本质是flow计算的问题

    第11次bug是load发出多个请求,读入不是同一时间,同质请求判断不全

    这两个bug和规格bug没有聚集关系。

    开始胡扯:个人认为,我们作业中宏观显示出来有聚集关系,一部分原因是,佛系测试者本来就佛系测功能,规格bug自然也报的少,另外的一些测试者,比较认真,测功能比较全面,规格检查也比较全面,所以两种bug同比增长…………)

     PART4 规格优化

    前置条件

        public synchronized void setCredit(int i) {
            /**
             * @REQUIRES: 
             * @MODIFIES: 	his.credit;
             * @EFFECTS: 	his.credit==old(	his.credit)+i;
             * @THREAD_REQUIRES:
             * @THREAD_EFFECTS: locked();
             */
            credit+=i;
        }
    REQUIRES不完整
        public synchronized void setCredit(int i) {
            /**
             * @REQUIRES:  i+old(	his.credit)>=0;
             * @MODIFIES: 	his.credit;
             * @EFFECTS: 	his.credit==old(	his.credit)+i;
             * @THREAD_REQUIRES:
             * @THREAD_EFFECTS: locked();
             */
            credit+=i;
        }
    改进后

    后置条件

        private synchronized boolean judgeSame(Point src,Point dst,long reqtime) {
            /**
             * @REQUIRES: src!=null && dst!=null;
             *               0<=src.x,src.y,dst.x,dst.y<80;
             * @MODIFIES: None;
             * @EFFECTS: (exist Request r;	his.reqlist.contains(r);r.src==src && r.dst==dst && r.time==reqtime) ==> 
    esult==true;
             *             (all Request r;	his.reqlist.contains(r);!(r.src==src && r.dst==dst && r.time==reqtime)) ==> 
    esult==false;
             * @THREAD_REQUIRES:
             * @THREAD_EFFECTS: locked();
             */
            for(int i=0;i<reqlist.size();i++) {
                Request req=reqlist.get(i);
                if(req.getSrc().equals(src) && req.getDst().equals(dst) && req.getTime()==reqtime) {
                    System.out.println("#SAME Request");
                    return true;
                }
            }
            return false;
        }
    逻辑顺序
        private synchronized boolean judgeSame(Point src,Point dst,long reqtime) {
            /**
             * @REQUIRES: src!=null && dst!=null;
             *               0<=src.x,src.y,dst.x,dst.y<80;
             * @MODIFIES: None;
             * @EFFECTS: 
    esult==true ==> (exist Request r;	his.reqlist.contains(r);r.src==src && r.dst==dst && r.time==reqtime);
             *             
    esult==false==> (all Request r;	his.reqlist.contains(r);!(r.src==src && r.dst==dst && r.time==reqtime)) ;
             * @THREAD_REQUIRES:
             * @THREAD_EFFECTS: locked();
             */
            for(int i=0;i<reqlist.size();i++) {
                Request req=reqlist.get(i);
                if(req.getSrc().equals(src) && req.getDst().equals(dst) && req.getTime()==reqtime) {
                    System.out.println("#SAME Request");
                    return true;
                }
            }
            return false;
        }
    改进后
        private Taxi chooseTaxi() {
            /**
             * @REQUIRES: respondTaxi!=null;
             * @MODIFIES: None;
             * @EFFECTS: 
             *         (all Taxi taxi;	his.respondTaxi.contains(taxi);taxi.credit<taxi_chosen.credit 
             *     || (taxi.credit==taxi_chosen.credit && distance between taxi_chosen and src is smaller than distance between taxi and src));
             *         
    esult==taxi_chosen;
             */
            int maxcredit=0,mindistance=1000000;
            Taxi taxi_chosen=null;
            WriteFile(true,"***Respond Taxi Information
    ");
            for(Taxi taxi: respondTaxi) {
                WriteFile(true,taxi.toString());
                Point taxiloc=taxi.getLoc();
                if(!taxi.getTaxiState().equals(TaxiState.wait)) {
                    continue;
                }
                int taxi_credit=taxi.getCredit();
                int type=1;
                if(taxi instanceof Taxi_special)
                    type=2;
                int taxi_src=map.FindPath(taxiloc.x,taxiloc.y,src.x,src.y,type).size();            
                if(taxi_credit>maxcredit || (taxi_credit==maxcredit && taxi_src<mindistance)) {
                    maxcredit=taxi_credit;
                    mindistance=taxi_src;
                    taxi_chosen=taxi;
                }
            }
            return taxi_chosen;
        }
    中间变量
        private Taxi chooseTaxi() {
            /**
             * @REQUIRES: respondTaxi!=null;
             * @MODIFIES: None;
             * @EFFECTS: 
             *         (all Taxi taxi;	his.respondTaxi.contains(taxi);taxi.credit<
    esult.credit 
             *     || (taxi.credit==
    esult.credit && distance between 
    esult and src is smaller than distance between taxi and src));
             */
            int maxcredit=0,mindistance=1000000;
            Taxi taxi_chosen=null;
            WriteFile(true,"***Respond Taxi Information
    ");
            for(Taxi taxi: respondTaxi) {
                WriteFile(true,taxi.toString());
                Point taxiloc=taxi.getLoc();
                if(!taxi.getTaxiState().equals(TaxiState.wait)) {
                    continue;
                }
                int taxi_credit=taxi.getCredit();
                int type=1;
                if(taxi instanceof Taxi_special)
                    type=2;
                int taxi_src=map.FindPath(taxiloc.x,taxiloc.y,src.x,src.y,type).size();            
                if(taxi_credit>maxcredit || (taxi_credit==maxcredit && taxi_src<mindistance)) {
                    maxcredit=taxi_credit;
                    mindistance=taxi_src;
                    taxi_chosen=taxi;
                }
            }
            return taxi_chosen;
        }
    改进后
        public long getTime() {
            /**
             * @REQUIRES:
             * @MODIFIES: None;
             * @EFFECTS: 
    esult=	his.time;
             */
            return time;
        }
    ==的问题
        public long getTime() {
            /**
             * @REQUIRES:
             * @MODIFIES: None;
             * @EFFECTS: 
    esult==	his.time;
             */
            return time;
        }
    改进后

    PART5 设计规格和撰写规格的体会

    到目前为止依然是先写代码再写规格,和老师的要求是反着的orz……后面会努力改过来

    刚开始写规格的时候基本上EFFECTS用的都是自然语言,因为不能够抽象出这段代码的逻辑影响。在第10,11节课讲完以后,受到课上PPT中示例的启发,逐渐能够用

    布尔表达式等相对规范的方法进行JSF书写。

    说真的刚开始觉得这个很鸡肋,很麻烦,但是中间隔了很长的时间没有看自己的代码,回来直接看规格,嘿,瞬间理清了自己代码,感觉不错,慢慢地开始对规格撰写这件事有了改观。

    现在还在入门级,境界不够,所以如此感受不到规格设计的重要性……希望经过不断锤炼,自己能领悟个中真谛吧~

  • 相关阅读:
    2.搭建第一个http服务:三层架构
    1.基础入门
    MyISAM和InnoDB索引区别
    分区
    事务的四大特性
    事务
    String
    自己写native方法
    序列化和反序列化
    反射
  • 原文地址:https://www.cnblogs.com/jyqin1117/p/9101144.html
Copyright © 2011-2022 走看看