一、第一次作业

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. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

  2. FFT \ NTT总结(多项式的构造方法)

    前言.FFT  NTT 算法 网上有很多,这里不再赘述. 模板见我的代码库: FFT:戳我 NTT:戳我 正经向:FFT题目解题思路 \(FFT\)这个玩意不可能直接裸考的..... 其实一般\(FF ...

  3. BZOJ第7页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1600   BZOJ1601   BZOJ1602   BZOJ1603   BZOJ1604   BZOJ1605   ...

  4. react入门(一)

    JSX语法: HTML 语言直接写在 JavaScript 语言之中,不加任何引号 , JSX语法中不能使用js中的关键字,例如:class 需要改为className JSX语法中要写表达式的话,需 ...

  5. js改变盒子大小(上下左右)分析

    js改变盒子大小 知识点 三个mouse事件:mousedown mousemove mouseup css的定位和cursor 思路 先解决单边问题识别范围,得到所选区域 event. 根据距离,判 ...

  6. 简单谈谈js中Promise的用法

    首先先推荐一篇博文:http://blog.csdn.net/jasonzds/article/details/53717501 这篇博文很清晰的说明了Promise的用法,这里来简单总结一下: Pr ...

  7. quartz.net 3.x 使用总结

    quartz文档:https://www.quartz-scheduler.net/documentation/index.html 这里用新建的控制台项目进行演示. 目标效果为每隔一秒在控制台上输出 ...

  8. mysql 服务启动失败

    mysql 数据库连接失败 1.用naviCat Preiumn 连接本地的mysql 失败,查找原因,mysql 数据库服务没有启用,但是在服务列表里面没有找到对应的mysql 服务. 所以在cmd ...

  9. 软件质量与测试——WordCount编码实现及测试

    1.GitHub地址       https://github.com/noblegongzi/WordCount 2.PSP表格 PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟) ...

  10. 【OpenCV-Python:实现人脸、人眼、嘴巴识别】实战(一)

    AI时代的到来,手机上的APP开始应用人脸识别去完成事情,如iphoneX的人脸解锁,百度自动贩卖机的人脸识别系统进行支付,支付宝的人脸识别登录等,提高了使用软件的易用性,但也因为其便利性,在某些市面 ...