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: \this.credit;
         * @EFFECTS: \this.credit==\old(\this.credit)+i;
         * @THREAD_REQUIRES:
         * @THREAD_EFFECTS: \locked();
         */
        credit+=i;
    }
REQUIRES不完整
    public synchronized void setCredit(int i) {
        /**
         * @REQUIRES:  i+\old(\this.credit)>=0;
         * @MODIFIES: \this.credit;
         * @EFFECTS: \this.credit==\old(\this.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;\this.reqlist.contains(r);r.src==src && r.dst==dst && r.time==reqtime) ==> \result==true;
         *             (\all Request r;\this.reqlist.contains(r);!(r.src==src && r.dst==dst && r.time==reqtime)) ==> \result==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: \result==true ==> (\exist Request r;\this.reqlist.contains(r);r.src==src && r.dst==dst && r.time==reqtime);
         *             \result==false==> (\all Request r;\this.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;\this.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));
         *         \result==taxi_chosen;
         */
        int maxcredit=0,mindistance=1000000;
        Taxi taxi_chosen=null;
        WriteFile(true,"***Respond Taxi Information\r\n");
        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;\this.respondTaxi.contains(taxi);taxi.credit<\result.credit 
         *     || (taxi.credit==\result.credit && distance between \result and src is smaller than distance between taxi and src));
         */
        int maxcredit=0,mindistance=1000000;
        Taxi taxi_chosen=null;
        WriteFile(true,"***Respond Taxi Information\r\n");
        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: \result=\this.time;
         */
        return time;
    }
==的问题
    public long getTime() {
        /**
         * @REQUIRES:
         * @MODIFIES: None;
         * @EFFECTS: \result==\this.time;
         */
        return time;
    }
改进后

 

 

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

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

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

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

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

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

 

转载于:https://www.cnblogs.com/jyqin1117/p/9101144.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值