zoukankan      html  css  js  c++  java
  • OO第一单元总结

    一、程序分析

    1.第一次作业

    类图

    复杂度分析

    思路分析

    第一次作业较为简单,年轻的我也没想太多扩展性的部分,求导非常简单(后面两次理所当然的重构了)。虽然很尽力的想要使用面向对象的思路,还是能在代码中看到很重的C的痕迹,类中的一个个方法更像是C语言里的函数。

    2.第二次作业

    类图

    复杂度分析

    思路分析

    第二次作业的复杂性较第一次有了明显的提升,加入了sin和cos两个三角函数的求导。其实在构思第二次的时候我想到了分别构造三个基本初等函数类和复合函数类,这样的话可扩展性的比较好,毕竟鬼知道第三次又会多出什么更复杂的函数,然而我认为采用四元组法的话无论化简还是求导都要简洁的多,还是没禁得住诱惑,也导致了第三次作业的重构...

    3.第三次作业

    类图

    复杂度分析

    思路分析

    第三次作业的复杂性又上了一个台阶,尤其是我第二次采用的是四元组的方法。除了一个主类外,我又新建了表达式类、项类、常数类、三角函数类、幂函数类,分别实现求导接口,其中表达式、常数、三角函数和幂函数都继承自因子类。表达式类中包含一个项类的容器,项类中包含一个因子类的容器,三角函数中包含一个因子类的对象。在化简方面,本着“先保证对再说吧,还要啥自行车”的思路,我一开始没有做过多的优化,但是最后看着一串串的*0*1还是忍不下去了,开始四处找细节优化,而最终的bug也基本出现在这个阶段。

    二、我的Bug分析

    1.第一次作业

    按说第一次的作业非常简单,需要考虑的情况也比较少,不应该出现什么bug,然而我的bug它就是来了...由于没有考虑在化简的时候全部消没了的情况,在碰到诸如x-x这种数据时,我的程序会输出空串,就是这样一个bug,被我们room的魔鬼们捅了二十多刀....

    2.第二次作业

    第二次作业的bug也比较弱智,在这次作业的化简步骤中,我只针对两项变一项的进行了化简,如sin^2+cos^2-->1,1-sin^2-->cos^2等,然而由于我写代码时的一些纰漏,会出现一个魔幻的bug,比如要将cos^2加入式子时,我会先扫描之前有没有sin^2,如果有的话,会将sin^2变成1,但是cos^2还是会加入式子,相当于凭空多了一项......会出现这样的bug,归根结底还是本地测试做到非常不够,但凡我在本地是测试一组像sin(x)**2+cos(x)**2这样的数据这样的bug就可以消弭了。顺便提一句,这个bug又被我们room的魔鬼们捅了15刀。

    3.第三次作业

    比起前两次作业,我第三次作业的bug可谓是多点开花,包括了部分WF情况没有考虑、化简失败变成WF、遇到多重嵌套会TLE等等。我主要想谈的就是其中第二种bug,前面有提到,本来这次作业我想保证正确,不做太多的优化,但最终还是慢慢的把一些*1*0的格式化简了。其实在化简的时候我就有预感,这些处理肯定会导致bug,因为在简化的时候我就能明显感觉到我的脑子是乱的,比如这个地方的几项是加号连接还是本神的求导自带加号完全不清楚了,对于每个测试数据,甚至我自己都不知道我的程序的输出怎样的结果。我认为,想要规避这样的局面,首先应该在构思代码的时候就将化简包括在内,否则后期东一榔头西一棒子的化简真的很容易搞乱自己。

    三、发现别人Bug的策略

    关于这一点,emmm,本来我是想学着评论区大佬搭一个对拍器的,顺便让自己熟悉一下脚本的操作,但最后由于种种原因没能得以实现.......在寻找他人bug时,我一般读一读他人的代码,尝试读出别人的逻辑错误,但看了几个人的代码后,我发现这种办法其实效率比较低,那些一读就能读出的bug别人自己看一遍也就发现了,那些隐藏的比较深的bug光读一遍也不一定能读出来。因此,之后我就重点读一读我认为比较困难的部分,比如第二次的化简,第三次的读入和化简,同时也能了解一下别人的思路。再一个就是暴躁输入边界数据,看看能不能蒙中bug。

    四、应用对象创建模式

    其实现在想来,尤其是第三次作业,有些地方是很适合用工厂模式的,比如说将一项用‘*’分离出多个因子时,就可以将每一段直接塞入工厂,创建对应类型的对象,sin/cos里面的内容也是同理,可以直接将括号里的内容塞给工厂。反观我的代码,这一部分确实显得十分冗杂,我在项类和三角函数类中定义了一个一样的方法,作用就是放入字符串返回因子对象,虽然思路差不多,但采用工厂模式的话明显感到代码会更简洁有条理一些,同时耦合度也会降低。

    五、对比和心得体会

    三次作业都是推翻重构,而且一次比一次难,我切实的体会到了可扩展性确实是衡量一个代码是否优秀的一个重要指标,如果有同学在第二次作业中就采用类似第三次作业的方法,或许在那时会显得做了许多无用功,效果还不一定有我们四元组好,但是当第三次作业出来,这个同学只需要加几个类,添几段代码,而我们这些四元组选手却只能咬着铅笔头构思这位同学在第二次就构思好的东西,可以说是高下立判。

    再有,写代码要有一种“谋定而后动”的感觉,就如我的第三次作业,按事先的思路写完代码后,忽然想要进一步优化,结果搞得代码处处打补丁,东一个if西一个else,可读性下降不说,还会导致各种奇怪的bug。当然 ,这不是说要事无巨细的把每一行代码想明白再开始敲,而是要大体明白代码分几部分,每一步分要干嘛,大致怎么实现,具体代码怎么写还是等到写的时候在结合上下文考虑决定。

    还有就是要多和同学交流,可以和关系好的同学私下讨论,也可以去讨论区看看那些优秀的同学是怎么处理的,就像我第一次作业的唯一一个bug,其实讨论区有一个测试数据就能测试出,但我当时并没有怎么关注,直到强测开始进行的时候才无聊翻翻讨论区,一看到那个测试数据我就背后一凉,心里一紧,回到自己的程序中测试,果然出现了错误,然后我能做的就只有看着同屋的盆友们一刀一刀捅进去,心如刀割哇!

  • 相关阅读:
    C#成员设计建议
    基于任务的异步编程模式(TAP)的错误处理
    基于任务的异步编程模式(TAP)
    C#克隆
    C#操作excel打印
    父元素如何围住浮动子元素
    intellij idea创建第一个动态web项目
    Idea快捷键
    Python中列表的copy方法
    C++读取数量不定的数据
  • 原文地址:https://www.cnblogs.com/12138abc/p/12540698.html
Copyright © 2011-2022 走看看