OO第一次单元总结

OO第一次单元总结

前言

第一单元的三次作业:多项式求导。

第一次作业

(1)基于度量来分析自己的程序结构

类图:

度量分析:

第一次作业是简单幂函数求导,设计了两个类,但从类图可以看出其实相当于只有一个类。这一次作业是第一次作业,基本没有理解面向对象编程的思想,还是以面向过程的方向实现了。在Compute类中,handle方法负责对输入字符串进行处理,并存储数据,derivate方法负责求导,并将结果输出。这很像是C语言里构造了两个函数,因此拓展性很差。

(2)分析自己程序的bug

第一次作业由于没有认真研读指导书以及构思,上来就写代码,导致最后出现了很多的输入格式问题,在后续的测试中只发现了部分,另一部分在互测中显露出来。
这次作业共有4个bug。第一个最主要的问题是数据类型,没好好看指导书,我想当然地选择了long型。第二个bug是非法空白字符WF问题,对空白字符的定义没搞清。第三个是只有空格的输入程序直接崩溃。第四个则是在输出优化时,当只有常数项时,我直接跳过而没有任何输出。
第一次作业互测结束之后,看到被hack的次数,让我深刻意识到指导书的重要性。

(3)分析自己发现别人程序bug所采用的策略

在互测过程中,首先,针对自己在测试时发现自己代码存在的bug,对别人的程序进行了相应的测试;其次,针对每个人的代码,我主要通过输入格式以及输出优化这两部分代码来查看,找出代码中存在的漏洞。

第二次作业

(1)基于度量来分析自己的程序结构

类图:

度量分析:

第二次作业是在第一次作业的基础上增加了简单三角函数的求导。在老师课上的指导下,在最初的设计构思上渐渐向面向对象靠拢,代码重构,从第一次的基本只有一个类到这次作业实现了三个类,且依照老师所说的各有分工和功能实现。Poly类是主类,IoHandle类专门用来负责处理输入输出,利用正则将表达式分割成一个个项,Term类对每一个项进行相应的分割和数据处理,而Factor类则是对每一个因子进行求导及数据处理。由度量分析可以看出,问题仍旧集中在IoHandle即输入输出的处理,输入部分我基本是完全复制的第一次作业的handle方法,因此和上次作业一样这部分圈复杂度很高,不易拓展。

(2)分析自己程序的bug

这次由于吸取上次的教训,在写代码之前先认真研读了指导书,对于新增部分的格式规范等问题预先记录,因此在互测阶段没有新的bug产生。但是,由于IoHandle类输入部分基本完全复制第一次作业的handle方法,在上一次互测中未被发现的bug在这一次互测中被hack,有1个bug。当只输入“+”时,未能识别出WF。

(3)分析自己发现别人程序bug所采用的策略

互测过程中,除了对第一次发现的问题进行测试外,仍主要通过阅读别人代码里的正则部分来针对输入格式规范进行测试,此外就是一些边界值和特殊值的测试。

第三次作业

(1)基于度量来分析自己的程序结构

类图:

度量分析:

第三次作业是在第二次作业的基础上引入了嵌套因子和表达式因子的求导。刚开始构思时,感觉难度提升的有点大,看完PPT里老师给的结构,更是云里雾里。后来在讨论区看完各大佬以及荣老师的分享才渐渐有了思路,离ddl不远了,所以并没有多少细致的构思就开始动手了。这次的代码得益于第二次作业的重构,由于表达式因子的存在,在上次的IoHandle、Term、Factor之外增加了Poly表达式类,用来处理表达式。它们之间的关系可以由类图看出。从度量分析可以看出,最大的问题出现在Factor因子类中。这次作业中,我并没有用到课上讲到的继承和接口的知识,由于时间和掌握不够好原因没能成功运用,对不同的因子创建子类,继承自Factor因子父类,所以我的这个类写的就很冗长,循环也很多,不好优化,也无法拓展。

(2)分析自己程序的bug

这次的作业一共发现两处bug。第一个是由于手残,打错了一个变量名,时间紧张自己也没有发现和测试出来,弱测和中测也通过了,在强测和互测中被疯狂hack。第二个则是当嵌套层数很多时,不断地递归导致CPU运行时间超过限制。对于第二个bug的修复,我通过先去除无用括号再代入递归的方式加以解决。

(3)分析自己发现别人程序bug所采用的策略

这次作业互测由于对WF的限制,我主要就比对指导书,从指导书中寻找边界和特殊情况,编写不同的测试用例来测试别人的代码。

总结

经过这三次作业的洗礼,感觉自己从一个只知面向过程编程的小白,渐渐了解并理解面向对象编程的思想,每一次的作业都有所进步,可惜还没能真正掌握和实现继承和接口,这周的空闲再好好看看。希望自己可以坚持到底!

posted on 2019-03-27 00:16  Hefarry  阅读(186)  评论(0编辑  收藏  举报