写在前面
本次博客主要是对第一单元多项式求导作业的总结与分析,以及自己学习这门课程一段时间以来的一些思考。
就像课上同学分享的那样,如果说把构建一份完整的代码比作造一架飞机的话,我们之前所学的面向过程的编程就相当于先造机头然后造机身再造机翼等等,而面向对象的编程则是造好机翼、机身、引擎等部件,然后把他们再拼成一架飞机。面向对象这门课程不同于以往我们所学习的C语言和数据结构等编程课程,我们需要学习的不只是java这门新的语言,更重要的是在学习过程中实现编程思想的转变。
第一次作业
第一次作业是对于只包含简单幂函数的多项式的求导,由于多项式求导相当于每一项求导之和,容易想到将多项式拆分成各个项然后分别进行求导再相加。整个程序主要包含表达式的输入及其合法性的验证、多项式的拆解、项的求导、结果的化简几个部分。
输入及合法性验证
在这里我采用了正则表达式来验证输入的合法性,但是在具体的实现中出现了一些问题。我使用了一整串正则表达式来匹配所有输入,这种方法虽然能成功匹配,但是对于比较长的字符串,则会出现爆栈的问题。应该先把表达式拆分成项,再针对像进行合法性的检验。
多项式的拆解
由于这次的表达式只是简单带系数多项式和的形式,所以我们拆分时只需要根据 “+” 号进行拆分就可以,在这里需要注意的要提前将表达式进行初步的规范化,比如将 “--” 替换成 “+” ,将 “^+” 替换成 “+” 等,从而方便这一步的拆解。
项的求导
首先要将所有的项化为标准形式 a * x ^ b,比如常数项后要补上 * x ^ 0 及类似的几种情况,接下来就是根据幂函数的求导规则进行计算了。
结果化简
结果化简主要包括同类项的合并以及多余符号的去除
程序结构分析
这次作业我只使用了一个类,包括了检查、标准化、化简、以及主函数求导四个方法。
bug分析
1.正则表达式匹配过程中的爆栈问题;
2.正则表达式匹配时 space 和 tab 用 \s 匹配;
3.求导过程中在系数为 0 时加了 break 导致异常中断。
第二次作业
第二次作业加入了三角函数以及多项相乘的求导,但除了求导规则有所改变外,总体思路与第一次相差不大。在此只简单说明与第一次不同之处。
输入合法性的检测
这次由于加入了数据长度的限制,可以使用整串正则表达式匹配。
项的求导
在这一部分,我们需要将每一项再以 “*” 进行进一步的拆解,然后将每一项的求导结果与其他项的和作为结果的一部分。
程序结构分析
由于对面向对象意识依然没有很好的建立,我这次仍然只使用了一个类,这也使我在之后的第三次作业中遇到了比较大的困难。
bug分析
在求导过程中,在处理系数带负号的sin函数时出现了一些错误,导致程序输出会缺少项。
互测阶段寻找bug的策略
1.针对普遍性出现的bug进行尝试;
2.针对自己编程过程中出现的bug进行尝试;
3.根据每个类和每个方法的作用查看有没有明显的错误。
Applying Creational Pattern
这几次编程过程中还是体现出了很多问题,其中最主要的还是面向对象的思想不够成熟,在架构阶段依然是以面向过程的思想进行架构,导致实现每次实验都需要进行重构,不止浪费了很多时间,而且容易出现新的bug,这也导致了我在第三次作业中的失败。再有就是debug阶段投入还不是很够,出现了一些非常基础的bug。
在之后会努力使用面向对象的思想来进行作业的架构,同时投入更多的时间放在架构以及debug阶段吧。