第一单元的三次做业:多项式求导。编程
类图:
度量分析:函数
第一次做业是简单幂函数求导,设计了两个类,但从类图能够看出其实至关于只有一个类。这一次做业是第一次做业,基本没有理解面向对象编程的思想,仍是以面向过程的方向实现了。在Compute类中,handle方法负责对输入字符串进行处理,并存储数据,derivate方法负责求导,并将结果输出。这很像是C语言里构造了两个函数,所以拓展性不好。测试
第一次做业因为没有认真研读指导书以及构思,上来就写代码,致使最后出现了不少的输入格式问题,在后续的测试中只发现了部分,另外一部分在互测中显露出来。
此次做业共有4个bug。第一个最主要的问题是数据类型,没好好看指导书,我想固然地选择了long型。第二个bug是非法空白字符WF问题,对空白字符的定义没搞清。第三个是只有空格的输入程序直接崩溃。第四个则是在输出优化时,当只有常数项时,我直接跳过而没有任何输出。
第一次做业互测结束以后,看到被hack的次数,让我深入意识到指导书的重要性。优化
在互测过程当中,首先,针对本身在测试时发现本身代码存在的bug,对别人的程序进行了相应的测试;其次,针对每一个人的代码,我主要经过输入格式以及输出优化这两部分代码来查看,找出代码中存在的漏洞。设计
类图:
度量分析:3d
第二次做业是在第一次做业的基础上增长了简单三角函数的求导。在老师课上的指导下,在最初的设计构思上渐渐向面向对象靠拢,代码重构,从第一次的基本只有一个类到此次做业实现了三个类,且依照老师所说的各有分工和功能实现。Poly类是主类,IoHandle类专门用来负责处理输入输出,利用正则将表达式分割成一个个项,Term类对每个项进行相应的分割和数据处理,而Factor类则是对每个因子进行求导及数据处理。由度量分析能够看出,问题仍旧集中在IoHandle即输入输出的处理,输入部分我基本是彻底复制的第一次做业的handle方法,所以和上次做业同样这部分圈复杂度很高,不易拓展。对象
此次因为吸收上次的教训,在写代码以前先认真研读了指导书,对于新增部分的格式规范等问题预先记录,所以在互测阶段没有新的bug产生。可是,因为IoHandle类输入部分基本彻底复制第一次做业的handle方法,在上一次互测中未被发现的bug在这一次互测中被hack,有1个bug。当只输入“+”时,未能识别出WF。blog
互测过程当中,除了对第一次发现的问题进行测试外,仍主要经过阅读别人代码里的正则部分来针对输入格式规范进行测试,此外就是一些边界值和特殊值的测试。继承
类图:
度量分析:递归
第三次做业是在第二次做业的基础上引入了嵌套因子和表达式因子的求导。刚开始构思时,感受难度提高的有点大,看完PPT里老师给的结构,更是云里雾里。后来在讨论区看完各大佬以及荣老师的分享才渐渐有了思路,离ddl不远了,因此并无多少细致的构思就开始动手了。此次的代码得益于第二次做业的重构,因为表达式因子的存在,在上次的IoHandle、Term、Factor以外增长了Poly表达式类,用来处理表达式。它们之间的关系能够由类图看出。从度量分析能够看出,最大的问题出如今Factor因子类中。此次做业中,我并无用到课上讲到的继承和接口的知识,因为时间和掌握不够好缘由没能成功运用,对不一样的因子建立子类,继承自Factor因子父类,因此个人这个类写的就很冗长,循环也不少,很差优化,也没法拓展。
此次的做业一共发现两处bug。第一个是因为手残,打错了一个变量名,时间紧张本身也没有发现和测试出来,弱测和中测也经过了,在强测和互测中被疯狂hack。第二个则是当嵌套层数不少时,不断地递归致使CPU运行时间超过限制。对于第二个bug的修复,我经过先去除无用括号再代入递归的方式加以解决。
此次做业互测因为对WF的限制,我主要就比对指导书,从指导书中寻找边界和特殊状况,编写不一样的测试用例来测试别人的代码。
通过这三次做业的洗礼,感受本身从一个只知面向过程编程的小白,渐渐了解并理解面向对象编程的思想,每一次的做业都有所进步,惋惜还没能真正掌握和实现继承和接口,这周的空闲再好好看看。但愿本身能够坚持到底!