2018 OO第一次总结(作业1-3)
第一次作业
1.程序分析
(1)OO度量
(2)类图:
(3)分析与评价:
这次作业由于作业整体设计难度不大,因此按照去年暑假上的OO先导课老师讲的设计方法很容易实现一个还不错的面向对象式程序,类与类之间的耦合度不是很高。但是即第一次简单的作业还是在设计上出现了漏洞被找到了bug,说明设计做的还是不够充分。
类图分析:本次设计分为Poly类,InputDeal类,Main类,Item类,其中Item类实现了Comparator接口,Main类主要进行主函数运行。Item是一个项数和系数的偶对,并且通过Comparator接口进行按照指数递增的顺序排序。InputDeal的主要作用是对输入序列进行处理,包括合法性检查。
2.
本次作业公测所有测试样例点全部通过,互测的时候被发现一个bug,原因是若出现(0,0) (0,0)两个指数和系数都为0的程序不会判断(0,0)是指数重复。出现这个问题的原因是程序采用了链表存储相应多项式信息,首先会将系数为0的项删掉,使其不能加入到链表之中去,然后再进行判断是否出现重复指数的操作。这次错误出现在InputDeal类的read_poly方法之中。
从设计结构角度来看,这个bug出现的原因主要还是在于自我设计的时候没有将设计的前后顺序等弄明白,程序的流程控制出现了问题。
从分类树角度来看,虽然在测试的时候注意到了指数重复这个错误树分支,但是测试使用的相同指数情况没有构造出系数为0的情况,系数为0的情况主要被用于测试当多项式最后为空的时候的输出是否正确。
3.测试策略:自我测试的时候按照分支树生成了测试数据,先对对方进行粗测,再结合代码进行进一步测试。
这次作业抽到的同学公测出现了一个bug,表现形式是会多输出一个逗号。经过阅读代码以及调试,发现原因来自于输出控制不当,当最后计算结果幂常数项为0的话会多输出一个逗号,因为这个逗号是放在所有系数和指数都不为0的项输出之前的。由于此次任务比较简单,针对自己有疑问的几个带代码片段也进行了针对测试,并未发现问题。
第二次作业
1.程序分析
(1)OO度量
(2)类图:
(3)分析与评价:
这次作业经历了从模拟时间到记录请求完成时间来判断同质两种设计方式的转变,单就本次作业来说,后者的编程复杂度远远比前者低。存在的最主要问题就是在遇到一个稍微复杂的问题时候如何快速而且合理地划分出不同的类,如何合理分配每个类的行为与方法。
类图分析:本次设计主要分Main Request Queue Floor Lift Scheduler类这几个类,Main类是运行主函数,当从main类输入一条指令会送到Floor或者Lift类进行合法性判断,并由电梯和楼层类发出请求(向Queue对象中插入一个Request类对象)。然后输入完毕后调度器依次遍历Queue请求队列中的所有请求,输出多了人类主要有schedule方法(负责判断同质以及调度),pop方法将输出当前执行过的请求并打印出相应的信息。
2. 本次作业公测和互测部分顺利通过
这次作业让我认识到了bug和设计结构密切相关,本来是采用了模拟时间的写法,但是在几个开关门瞬间的理解条件总是处理不当,导致总是出现了各种意想不到的bug。后来采用了记录按钮熄灭的时间来判断是否是同质请求,代码逻辑变得简单起来,后期调试和测试也简化了不少。
3.这次程序最后并没有在互测阶段发现对方的bug,但是在尝试找bug的过程中收获了不少的知识。
采用的测试策略:先使用自己编程的时候构造的分支树测试样例对对方程序进行粗查,随后结合代码对可能出现的隐患位置进行重点攻破。
在浏览一遍对方的代码之后,发现了一个很有可能出现问题的情况:对方读取时间的正则匹配是无限个数字,但是在将字符串转为数字的时候并没有try-catch去捕捉parseDouble产生的异常,这个地方最初在我看来是有很大隐患的:double的数据范围也是有限的,假设输入时间位数超过double的范围,且最高一位是1,其余位是0的话,如果发生溢出,高位丢失,然后就会出现将一个很大的数读成0或者是直接程序crash。但是经过尝试发现每次都没有出现问题,到此处单步调试后发现原来的数字被读成了infinity,而且这个infinity默认大于所有的数。上网查阅资料发现infinity不等于MAX_DOUBLE,而是大于MAX_DOUBLE,于是构造MAX_DOUBLE 和infinity之间的数字,但是结果发现在eclipse之中只要超过MAX_DOUBLE 就会识别为infinity,与资料不符。这个过程中虽然最后证明了该同学的程序不存在问题,但是我仍然认为在使用这种有可能出现异常的函数时应该养成使用try-catch的习惯。
第三次作业
1.程序分析
(1)OO度量
(2)类图:
(3)分析与评价:
这次作业由于第二次作业的设计方法对于这次作业来说不是很适合但是又必须继承第二次作业的关键类,所以在修改的过程中为了追求代码的正确性牺牲了许多老师提到的良好的设计习惯。最大的体现就是核心类的方法过多,每个方法代码长度比较长,而且分支结构太多,这些都是代码的隐患,在以后的作业中要尽可能的避免这类情况的出现。量化分析结果也表明块嵌套层数过多,这种问题以后在编程的时候一定要注意。
类图分析:本次设计主要分Main Request Queue Floor Lift Scheduler NewScheduler类这几个类,Main类是运行主函数,当从main类输入一条指令会送到Floor或者Lift类进行合法性判断,并由电梯和楼层类发出请求(向Queue对象中插入一个Request类对象)。然后输入完毕后调度器依次遍历Queue请求队列中的所有请求,对是否同质以及是否可以捎带进行判断。其中is_same是判断是否同质的方法,而set_mr是设置主请求的方法,update是在进行捎带之后更新到达指定楼层的方法。
2.自我程序分析
本次程序顺利通过公测和互测环节,但是完成程序初稿的过程就遇到了不少的bug。这些bug主要集中于对上次的类Scheduler继承后重写的新的schedule方法之中。这次在编写后程序明显感受到了第二次设计样式的不足,第二次主要是模拟当前按钮熄灭的时间并没有关心当前电梯的运动状态,这种写法在第二次设计起到显著的简化设计的作用,但是却为第三次设计造成了许多困扰。
3.测试方法
本次测试仍然是采用自测的时候按照测试树生成的测试样例加上采用结合代码进行针对测试。但是这次在使用自测的样例的时候就测试出两个问题,一个是同质请求判断的问题,另外是捎带情况处理的边界条件没有处理好。阅读代码后发现同质请求判断失败的主要原因是只判断了相对于主请求是否是同质请求,而没有判断相对于其他捎带请求是否同质。
总结
1. 关于设计问题
第二次作业原本的设计是想模拟现实真实的状况,在外部模拟一个系统真实时间,把请求映射到电梯按钮的熄灭和按亮状态,只有在时间到达了相应的请求发出时间请求才会开始被访问,但是这样写出来的代码跟同学的直接记录这个请求完成时间来判断同质相比还是显得复杂了一些。于是便也采用了记录请求完成时间来判断同质的做法。但是第三次作业在第二次作业的基础上修改起来就很繁琐,也加上了许多判断控制条件,使得代码的结构以及逻辑变得极其复杂,还要对指导书上的捎带条件进行等价转换,整个过程十分复杂,很有可能需要在下一次的电梯作业进行代码的大量重构。经过第三次作业我深刻体会到了设计对于后续的修改以及调试起的决定性作用,一般来说,越是能模拟现实情况的设计在后期编写代码的时候就越容易实现以及调试测试。每次自己在测试找到bug之后更要及时反思原因,如果是编程过程出现实现不当,那么就要勤加练习,让自己的动手能力跟得上自己的思维。反之如果是设计过程中出现的显著漏洞,那么在每次作业之后一定要按时反思设计漏洞,不断规范设计流程和思路。
2. 善用eclipse的TODO标注功能
每次作业都不可能是一个下午和晚上就能够完全实现,而且每次编写代码的时候也不能保证某个地方的逻辑百分之百正确。在同学的推荐下,我开始使用eclipse的TODO标记功能,可以在有疑问的地方做下标记,后续作为测试的重点。晚上睡觉前或者是吃饭前可以对手头上的尚未完全完成的步骤进行标注,以便回来后继续完成。
3. 关于设计与编码的关系感想
第一次在课堂上听到老师强调设计的重要性是上学期计组课上高老师在P4之后反复强调在工程实现过程中设计的构思甚至花的时间应该超过敲代码的时间。快速写完代码后花大量时间找bug不仅让你整个工程的时间不会减少,更会让你的程序变成一个打满补丁而且不规范的程序。第三次作业度量分析之后被标红的部分(块嵌套过深)就是源于不停地向程序打补丁导致方法越来越多,调用越来越深。在今后的作业项目中一定要进行更细致的设计,甚至可以先构造大量样例对设计进行调试,确保设计的完备性之后再进行编码过程。在本文的最后附上上学期计组老师在做P5时给予我们的忠告,希望时刻能提醒自己。
2018 OO第一次总结(作业1-3)的更多相关文章
- OO第一次总结作业
第一次OO博客作业 前言 面向对象课程已经经过了4周的时间.前三次作业全部是关于多项式求导的相关内容,内容由易到难,同时我也开始逐渐深入感受学习面向对象的各项特征,逐渐将自己的编程风格从C向真正的面向 ...
- OO第一次作业总结
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
- OO第一次博客作业
OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...
- OO——求导作业总结
目录 OO--求导作业总结 程序结构的分析 第一次作业 第二次作业 第三次作业 对多项式合法性判断的讨论 程序bug的分析 未通过的互测bug bug的位置与程序结构的关系 继承和接口的使用 互测 手 ...
随机推荐
- SPI、IIC、IIS、UART、CAN、SDIO、GPIO、USB总线协议
SPI.IIC.IIS.UART.CAN.SDIO.GPIO总线协议 SPI(Serial Peripheral Interface:串行外设接口)SPI总线由三条信号线组成:串行时钟(SCLK).串 ...
- robotium之无name、ID仅有desc定位
场景如图: 没有name和ID,群里问了,也没人搭理我,自己试验了下,发现这个法子可用,直接贴代码: Activity act = solo.getCurrentActivity(); int ide ...
- 随机森林学习-sklearn
随机森林的Python实现 (RandomForestClassifier) # -*- coding: utf- -*- """ RandomForestClassif ...
- Python-HTML 最强标签分类
编程: 使用(展示)数据 存储数据 处理数据 前端 1. 前端是做什么的? 2. 我们为什么要学前端? 3. 前端都有哪些内容? 1. HTML 2. CSS 3. JavaScript 4.jQue ...
- ANN算法总结
kd-tree kd-tree works poorly in high dimensions (k<30) 自己实验的时候差不多20到30左右吧,超过之后,就真的很慢了 faiss suppo ...
- C#面向对象(封装)
以上就是面向对象的封装和初始化:
- 《Oracle 11g 入门到精通.明日科技.pdf》学习笔记
本博文整理者:刘军 本博文出自于: <Oracle 11g 入门到精通>一书 声明:1:转载请标注出处.本文不得作为商业活动.本人不负法律责任.违法者自负一切法律责任. ————————— ...
- jquery----用户密码验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 性能测试十四:Xshell链接linux虚拟机
一.先装一个linux虚拟机 VBox+centos1.先下载Linux镜像文件的ovf或者OVA文件2.打开vbox,点击菜单栏“管理”-“导入虚拟电脑3.选择解压路径中的ovf或者OVA文件,点击 ...
- Android SDK安装及配置模拟器
环境搭建 1.安装JDK 2.下载Android sdk exe格式和zip格式都可以 3.安装installer_r24.4.1-windows.exe文件,里面有两个应用程序: "SDK ...