• 第一单元博客作业


    ​ 第一部分 程序结构分析

    ​ (1)第一次作业

    ​ 第一次作业的内容较为简单,只是对幂函数求导,但是刚刚接触面向对象设计的我还保留着大量面向过程的思路,从结构化分析来看我的代码非结构化程度较为严重,基本就是面向过程编程了,唯一有点面向对象的样子就是建立了一个powerFunc的类,但是对于输入之类的都没有建立特别的类去处理,对于多项式也只是存在一个数组里,更好的做法应该是创建一个Poly类来管理多项式。但是由于本次作业较为简单,没有出现什么过于严重的bug,最后还是通过了。

    ​ (2)第二次作业

    ​ 第二周作业在幂函数的基础上加入了三角函数,并且引入了新的求导法则。第一次作业面向过程的缺点就体现出来了,完全不适合进行迭代开发。于是在第二次作业中我进行了重构,通过建立起一个公共的父类Func来管理幂函数和三角函数,然后构成项(Term)和多项式(Poly),同时采用了工厂模式进行新对象的创建。比起第一次作业,第二次作业更像是一个面向对象的程序,问题在于后续的化简部分产生了一些考虑不周的情况,导致出现了一些bug。不过由于结构化的设计,在后续修复的过程中没有遇到修完一个bug导致其他地方出现大量新bug的情况。

    ​ (3)第三次作业

    ​ 第三周作业的难度激增,加入了嵌套规则, 并对输入格式进行更为严格的检查。嵌套规则导致我们需要一层一层的解开输入函数的格式,然后随时进行格式分析和判断,建立起正确的联系关系。对于类的构建思路其实很明确,用Func作为所有函数的公共父类,Add,Mul,TaoWa三个类用于联系不同函数之间的关系,然后用Derivation接口将所有的函数和关系进行统一管理,最后会形成一个类似二叉树的结构。因为这样的设计,我放弃原本的Term和Poly类,但写完后仔细思考后才想到,这样会导致代码的结构化程度下降,直接从String输入跳到了单个函数Func,当中跨越读较大,代码冗杂,极大的破坏了结构化体系,但由于一开始实现的较为轻松,所以没有选择重构而是继续走下去。也正是这样导致了后来的大失败。

    ​ 在强测结果出来后我才发现我代码在输入处理上出现了严重的错误,进而导致后面一系列的连锁反应。在修复的过程中发现由于输入处理算法的问题导致所有bug都是拆东补西的状态,于是最后无奈只能对输入进行重构,但由于时间原因对于原本的没有Term和Poly的结构设计没有一起重构。

    第二部分 分析自己程序的bug

    ​ 第一周作业的bug问题出在对于保存幂函数的数组的处理上。当时没有考虑多个项加减和为0的情况,导致输出会变得极为奇怪。只是一个细节问题上的bug,和代码本身的结构性没什么大关系。

    ​ 第二周作业的bug主要是出在优化上,在对三角函数优化的时候对于系数的考虑没有做到完全,导致一些不该被化简的项被过度化简,出现了bug。也是一些细节问题的bug。

    ​ 第三周作业最大的bug就是在对输入的处理上。一开始以为也只是一些细节的bug,于是便开始进行细节微调,后来代码量越改越多,bug也越来越多,才发现问题出现根本的算法上。由于一开始测试的不完全,导致在一开始就错误的一个输入处理上进行一步又一步的深入,导致代码又臭又长,还不能得到正确的答案。以至于后来要进行重构。

    第三部分 分析自己发现别人程序bug所采用的策略

    ​ 对于别人程序的bug,首先就是自己测试的时候一些很刁钻的数据,然后是特意构造一些边界测试、压力测试之类的开地图炮。之后开始下载他人代码进行阅读,重点关注大量的if语句之间有没有漏掉的情况。

    第四部分 应用对象创建模式来重构

    ​ 第一周我们学习的对象创建模式是工厂模式,这其实在pre 的时候就已经了解过了,所以应用起来没有什么特别大的压力。我唯一的重构出现在第三周的输入处理上,真的有点让人绝望。

    第五部分 对比和心得体会

    ​ 前三周作业让我最难忘的肯定是第三周的输入处理了。我在这里栽了个大跟头,它也教会了我几个很重要的道理:

    ​ (1)走一步测一步,一定要多测!多测!多测!考虑所有的状况,尤其是这种复杂的输入一定要检查if是否涵盖了所有的方面,以为自己没问题了实际上bug一大堆。

    ​ (2)一定要有良好的结构设计。如果能做到良好的结构设计,能把(1)带来的影响降到最小,只用修改前面的部分就够了,顶多还要再改一下前后的连接部分。

    ​ (3)当发现bug 的时候要多想几步。不要用一些增加一堆恶心方法的方式来修一个小bug,有可能会出现一些新的bug,最好能做到用最小的修改改最多的bug,如果做不到,一定要想想自己这个方法到底能不能保证实现所有的要求。

    ​ (4)不要舍不得重构。说实话,week3的输入处理部分我写了一个下午,当出现一个又一个问题的时候,我想的是:“一个下午的心血不能白费啊!”然后再原本错误的代码上改来改去,改到最后也没能解决所有的问题。当发现自己的方法存在无法解决的问题时候,实在不行,该重构得重构。

    ​ 前三周可以说是OO入门,但我入的并不轻松,甚至可以说是相当凄惨。但这也会给我带来宝贵的教训和经验,让我再之后的学习中提放这些错误。

  • 相关阅读:
    hdu 1863
    数据结构与算法分析–Minimum Spanning Tree(最小生成树)
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    数据结构与算法分析 – Disjoint Set(并查集)
    数字逻辑电路课程设计报告
    高校成绩管理数据库系统的设计与实现
    PL/0编译器(java version) – SymbolTable.java
    [jquery]添加行内容后根据下拉菜单选择内容对比之前已有选项,若有重置再提示
    bootstrap-datetimepicker 日期控件的开始日期
  • 原文地址:https://www.cnblogs.com/yokies/p/12532388.html
Copyright © 2020-2023  润新知