前言:

  第一单元总共包括三次求导作业。这三次作业在我看来主要的任务在于熟悉java,熟悉面向对象的思考流程以及正则表达式。考察内容包括程序正确性,鲁棒性以及性能及优化。下面针对每一次作业进行一些分析。

第一次作业:

  类图:

    

   结构分析:

    

    

  第一次作业只有两个类:主类判断,剩下的一个类负责取值以及计算,因为没有明确分工,导致方法长度较长,整体具有面向过程的思想,而且第一次作业出现了一个很严重的bug:在合并同类项的时候应该用已经计算过的系数加减新进入的项的系数,但是在减的时候减反了,因此没能进入互测。其余他人bug在自己的代码中并未发现。

第二次作业:

   类图:

    

   结构分析:

    

    

    第二次的代码仍然存在着第一次的问题:类太过庞大,内部包括太多的方法,耦合度较高。

    强测和互测中均没有出现bug,但是优化并没有彻底。只优化了系数相同,可以提取公因子之后剩下诸如sin^2+cos^2或者1-cos^2,1-sin^2这种类型的式子,但是其实并非需要系数相同,也即系数不同是也可以提取一部分来进行合并,事实证明这样子不会造成负优化,但是并未如此做,同时也没有把正项提前。还有就是优化后的合并放在第二次优化之前,导致第二次优化后可以合并的式子并未合并。合并应该放在最后,这样子才能确保较高的性能分。

    在找别人Bug的时候首先关注的是格式错误但是它却可以给出答案的样例,以及构造结构复杂的式子,利用对拍器进行检验。(在符合要求的情况下越复杂越好,毕竟是对拍器检查正确与否)

 

第三次作业:

  类图:

    

   结构分析:

    

    

    第三次作业代码风格其实非常差,我需要自我反省。因为仍然没能够熟悉面向对象,所以看上去仍是面向过程。构建了六个类,分别是主类,判断格式类,处理类,对表达式,项,因子分别求导的类。因为我个人认为题目难度于我而言有一些大,所以我觉得能做出来是最重要的,代码风格是做出来之后考虑的事情。所以最简单的就是一个方法到底。到最后一个类中很多个方法都是强行为了少于60行拆开的。这与最开始没有一个明确的构架有关。

    同时代码中出现了很多的bug。比如在处理阶段,我判断是否整体表达式外面是否嵌套的有多余括号的时候,只判断最左边是否是左括号,这样导致了诸如(sth)+(sth)最后变成sth)+(sth这样的错误格式。同时判断格式是否正确也并不是在一个类中完成的。在计算的过程中其实也对数据有判断,并对不符合的进行错误信息输出。没能在一个类中完成所有的格式判断,也是因为没能提前做好架构。

    对于这次代码完全没有优化,也是因为无从下手,害怕因为优化导致输出出现格式错误。毕竟性能分占比不大。

    在互测环节仍然是利用复杂结构的数据,构造的时候卡括号,嵌套,次方这些自己写的时候感觉容易出错的地方,然后利用对拍进行结果验证。

 

结语:

  对于这三次作业都没有使用多态,接口,继承这些具有面向对象特征的方式。个人觉得在自己 的代码中,一个方法实现的功能过多且重复。应当首先设计一个抽象类,针对不同的输入继承一个对应的方法,然后进行求导计算。这样子可以使得代码简洁美观,且易于查错。因为在写代码之前没有一个良好的架构,所以代码整体都是面向过程。希望在此之后可以改进。

 

posted on 2019-03-24 15:40  Tinco  阅读(172)  评论(0编辑  收藏  举报