一、第一次作业

1、程序设计分析

![img](s1.ax1x.com/2018/04/02/CSgoSU.png)
图1 第一次作业类图 ![name](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402222354189-1523550375.png) ![](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402220004426-1328327190.png) 图2 第一次作业度量分析图

第一次作业整体较为简单,主要任务为判断输入的合法性。从度量分析中可以看出来圈复杂度(McCabe Cyclomatic Complexity)比较高,已经标红了。点开仔细看之后发现是Polynomial类的构造方法贡献了主要的复杂度,自己感觉应该是因为这个构造方法是从字符串获取多项式信息,不仅承担了用正则表达式解析字符串的功能,还完成了一大部分对输入合法性的检验,所以复杂度比较高。不过由于程序整体不太复杂,这个飘红的圈复杂度也不怎么感受的到,但在以后更复杂的设计中应当把不同的功能单独封装出来。

2、BUG分析

这次作业我通过了全部的公测,不过非常极限的是一个在计算时的比较致命的bug是在截止前20分钟才发现的。最后提交的时候这个bug并没有完全得到修复,这也导致了我互测时被查出了一个bug。我是为每一个Polynomial实例开了一个100w的数组来维护多项式的系数,这样无论是构造还是运算时逻辑都简化了很多。但是我又很多余的维护了一个最大系数deg属性,以减少一些不必要的运算,但是因为一时疏忽这个属性在运算时没维护好,导致了bug的产生。这个主要还是写完过了一些测试就很懒地没有再查代码导致的错误QAQ

二、第二次作业

1、程序设计分析

![](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402220010628-874451045.png)图3 第二次作业类图![](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402220016366-1305520546.png)图4 第二次作业度量分析

这次作业我思考的比较久的点就是如何筛去同质请求,一开始是当某个请求将要执行时往前去找是否有与它效果同质的请求,后来发现这样检查的情况并不完备。于是改为保证队首为合法的需要执行的请求,在每个请求运行完后往后筛去所有它的同质请求。这次的设计其实不太复杂,圈复杂度高主要是因为在main中进行了所有输入合法性的检查,大概也是设计比较简单导致dispatcher类分不到什么活沦为鸡肋(毕竟它只要拿出队首请求扔给电梯跑就行了)。

2、BUG分析

第二次作业公测挂了一个点,互测被找出一个BUG。公测挂的点是没有支持‘+’,这一方面是我没仔细看BUG树,一方面也是助教说的“前导0和‘+’号自行readme”误导了我。个人觉得这种东西留给readme来说意义不大,毕竟对程序设计没有实质性的影响,只是多起了争议。互测被找出的BUG是100条上限的问题,也是我理解错了助教的话吧,“超过100条的情况自行readme”被我理解成了只要出现这种情况所有的请求怎么处理都可以readme,于是我就设计成了超过100条电梯不运行直接结束。总的来说这次的BUG和程序设计还是不太挂钩的 。

三、第三次作业

1、程序设计分析

![](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402220023585-1228497793.png)图5 第三次作业类图![](https://images2018.cnblogs.com/blog/1346258/201804/1346258-20180402220027438-818791263.png)图6 第三次作业度量分析

相比于第二次作业,本次作业需要完成“捎带”的功能,调度算法如何实现是本次的难点。在最开始构想时我把问题想简单了,写到获取捎带队列的时候发现其实十分麻烦。这个时候我面临着推倒重来和继续写下去(可能比较麻烦)两个选择,不过最后因为懒还是硬着头皮写下去了。这也导致最后写完有很多小BUG潜伏在很长的一段代码里,加上深夜debug脑子不清醒,花了很长时间才解决。第二天重新检查了一遍代码,修改了两处bug,就基本上ok了,还是比用数据来debug效率要高一点。

度量分析方面,这次圈复杂度偏高的主要原因我觉得还是因为本身算法设计的问题。在requestList类中用一个主请求从剩余请求队列中选出所有可捎带请求组成捎带队列的scan方法不可避免的有着很高的复杂的,事实上我在debug过程中看这段代码也是十分头疼,可见前期良好的设计还是十分关键的。

2、BUG分析

本次公测和互测都没有bug,个人觉得还是写的比较严谨,大量的测试给了这次的作业巨大的帮助。

四、寻找BUG的策略

在这三次作业的互测中,我拿到的代码写的都比较严谨,前两次各找出了一个基本无关程序设计只是和需求有冲突的bug。第三次的代码写了非常多的类和方法,有一点过度设计的意思,导致我看他的代码的时候十分不好受,不过还是用几组大数据测出了他设计上的BUG。

前三次我找别人bug的流程大概是:测自己的样例=>浏览代码的主逻辑,寻找逻辑上的设计错误=>仔细看具体实现的一些方法,寻找实现上的漏洞。从一些边界极限情况考虑程序的运行情况的时候,往往能找出一些BUG。

五、心得体会

在前三次作业中,我在编写代码之前都会做一个框架的设计,包括要实现哪些类,类中有哪些方法和属性,核心问题的算法如何设计等,发现确实这样在之后的编码过程中会顺畅很多,按照设计捋下来就行。

因此,就想计组的时候高老师教给我们的那样,充分的前期设计是十分重要的。不过虽然前期设计不可能想到每一个细节,还是要尽量多想清楚,或者给程序留够足够的调整空间,不然如果像我第三次作业一样写的过程中发现有问题就会面临一个不太好处理的情况。

OO前三次作业总结的更多相关文章

  1. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  2. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  3. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

  4. oo前三次作业博客总结

    第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...

  5. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  6. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  7. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

  8. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  9. Blog总结(前三次作业总结)

    前三次作业总结 1.前言 (1)第一次题目集共有8道题目,难度较为简单,知识点为JAVA的一些编程基础知识点,如输入输出,选择,循环,一维数组等. (2)第二次题目集共有5道题目,难度较第一次题目集有 ...

随机推荐

  1. [HDU5799]This world need more Zhu

    题面戳我 题意: 给定一棵树,m次操作,每次询问某一棵子树中,或者是某一条路径上,出现次数为a的所有数字之和与出现次数为b的所有数字之和的gcd 原题表述:the \(\gcd\) of the su ...

  2. 浅尝Code Map

    使用代码图调试你的应用程序:https://msdn.microsoft.com/zh-cn/library/jj739835.aspx 使用 Code Map 理解复杂代码(视频): https:/ ...

  3. Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL

    前面的文章主要是整理的Android 官方文档对OpenGL ES支持的介绍.通过之前的文章,我们基本上可以完成的基本的形状的绘制. 这是本人做的整理笔记: https://github.com/re ...

  4. Android 中 SearchView

    package com.example.euphemiaxiao.classsearch; import android.os.Bundle; import android.support.v7.ap ...

  5. windows下的react-native 开发环境搭建

    本教程用安卓手机作为演示. 首先安装jdk.本教程基于jdk1.8,安装时有一点要特别注意:jdk和jre必须装到不同目录下,否则初始化react-native项目时大概率报tools.jar not ...

  6. WCF服务自我寄宿

    WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为 ...

  7. 1-3 Spring Bean 的属性值设置

    详见http://www.cnblogs.com/chenssy/archive/2013/03/17/2964593.html 1.注入普通的属性值 <bean id="Cat&qu ...

  8. Java CAS机制详解

    CAS目的: 在多线程中为了保持数据的准确性,避免多个线程同时操作某个变量,很多情况下利用关键字synchronized实现同步锁,使用synchronized关键字修可以使操作的线程排队等待运行,可 ...

  9. [Tarjan 学习笔记](无向图)

    今天考试因为不会敲 Dcc 的板子导致没有AK(还不是你太菜了),所以特地写一篇博客记录 Tarjan 的各种算法 无向图的割点与桥 (各种定义跳过) 割边判定法则 无向边 (x,y) 是桥,当且仅当 ...

  10. es6学习笔记--promise对象

    Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...