OO第一单元总结博客

1.第一次作业

1.1思路分析

第一次作业主要任务是完成对表达式的去括号,在完成第一次训练的作业后使用梯度下降法分析表达式,将表达式,项,因子逐层分离。在完成表达式转换为各项因子后,难点就在于项与项之间的相乘以及符号的转化,表达式之间的因子用+,—号连接,而项之间因为可能又存在表达式的因子无法之间*连接。符号的问题,我在表达式的项连接时统一用+号,并给所有实现了因子类的接口增加了一个正负的属性,用于记录因子在最终表达式的正负,而相乘的问题我采用递归的方式来解决。

1.2结构分析


本次作业中类图如上,Expr,Term,Number,Power为实现了Factor的因子类,在梯度下降分析时存储信息,Lexer,Parser为梯度下降所使用的类,是实现梯度下降分析的工具。Multiplier类是用于项与项相乘时,采用递归方法进行相乘的类,是实现括号展开的工具。Organizer和Monomial是最后用于简化的类,在返回了展开的字符串后,将为简化的字符串经由Organizer遍历,拆解为单项式Monomial进行整合化简。

度量分析



许多方法复杂度较高,结构化程度低,耦合也很明显

1.3bug分析

本次作业bug主要为符号问题,对复杂表达式处理时符号的正负经常出错,在bug修复阶段找出了问题所在并进行了修复,在本次互测阶段,我才用随机数据的生成进行hack,与我同一互测房的同学们也在正负号处理上出现了问题。

1.4感想与收获

本次作业中最大的收获是对梯度下降法的学习与应用。在写作业之前对java的学习还停留在较浅的阶段,在作业中遇到不少与java相关的困难,在查阅资料解决后,对java有了更深的理解并且初步认识了OO的思想。

2.第二次作业

2.1思路分析

相比与第一次作业,第二次作业在表达式中增加了自定义函数与sum函数以及三角函数。在第一次作业的基础上,我采用了字符串替换的方法,将表达式中自定义函数与sum函数在梯度下降分析之前转换为表达式因子,新建三角函数因子类。这样就可以用第一次作业的构造处理表达式。然而也会引出许多问题。首先就是这样会造成多层括号的嵌套,梯度下降法本身便支持多层括号的分析,而我在处理表达式与项的展开时采用递归的方法,在对第一次作业的Multiplier类进行改进后便可以处理多层括号。其次,字符串替换过程也不被老师所提倡,一是不符合结构化层次的要求,二是字符串替换过程中可能会造成许多bug,在编写完成测试时便发现了在字符串替换过程中正则表达式造成的bug,然而仍有bug未找出来导致强测错了部分点。

2.2结构分析


本次作业相比与第一次作业增加了Trigonometric类,在梯度下降时用于存储和分析三角函数的类。增加了Replacefun类,用于在字符串输入后,梯度下降之前,对自定义函数进行字符串替换,而sum函数在lexer类中字符串输入后的预处理中替换。增加了MonomialTri类用于在字符串结果化简时,存储和分析每个单项式中的三角函数。

度量分析


与第一次作业相比,上次复杂度较高的方法并没有加以简化,并且因为第二次作业需要,复杂度更加高了,耦合度也更高,没有很好地运用层次化结构地思想

2.3bug分析

本次作业地bug正如前文所述,在表达式地字符串替换时产生了许多bug,如字符串替换时,正则表达式地缺漏,导致没有捕捉到本该替换的字符串导致的bug,字符串替换时添加括号的问题,正负号问题,sum函数中i的替换与sin函数产生的冲突,以及替换时的位置问题,都十分容易出错而导致bug,在本次作业强侧中,便是对sum函数捕捉的正则表达式缺漏,导致没有替换而产生的bug,在互测中,采用字符串替换的同学,或多或少可能都在正则表达式以及替换策略亦或是替换细节有某些小bug,而采用老师推荐的方法(将函数视为因子建模)的同学便很少有bug。

2.4感想与收获

因为自己采用了老师所不推荐的方式解析表达式不仅破坏了程序的层次性也造成了许多bug,可能也会导致后续的迭代开发中的诸多困难。还需要学习体会层次化结构设计以及面向对象的思想,才能写出更具有鲁棒性,易维护,易读的代码。

3.第三次作业

3.1思路分析

本次作业相比于第二次作业增加了函数的嵌套调用,三角函数内因子可以为表达式因子,以及多层括号的处理。多层括号的处理。在第二次作业所采取的策略已经支持了多层括号处理,三角函数内的因子在梯度下降解析是便以表达式的形式存储,在输出是直接将三角函数内的表达式转换为字符串输出便可,而函数的嵌套调用,在做函数字符串替换时,对于作为替换者的字符串,再递归做函数的字符串替换。相比于第二次作业而言,增加的要求不多。

3.2结构分析


本次作业相较于上次,没有增加新的类,只是在原有的类中进行了一些方法的修改以及方法的增添,没有实现新的功能,只是更改某些方法使得可以递归调用。

度量分析

本次作业是本单元最后一次作业,在此基础上看此架构。许多方法逻辑过于复杂,耦合度较高,类与类之间的层次关系不明显,没有很好的结构化特征。

3.3bug分析

因为直接在上一次基础上递归调用函数,原来的字符串替换导致的bug都已解决。而此次bug的问题在于三角函数内嵌套某些表达式因子时没有加一层括号,以及sum函数上下限的取值超过int时的问题。是一些细节上的错误,以及对问题的思考不够全面。而在互测中,同学们也大多产生了sum函数上下限超过int时而产生的bug。

3.4感想与收获

本次作业相较于第二次,增加的要求不多,然而在第三次作业中的bug是第二次作业中就有的了,而在第二次作业中强测,互测以及自己测试中都没有发现。测试无法说明自己的代码没有bug,即使过了中强测也要自己多多测试,以发现在测试中未能发现的bug

4.心得体会

第一单元是面向对象编程的开始,让我对面向对象的编程思想有了一个很好的了解。在这一个单元的三次编程作业中,我开始明白面向对象编程与面向过程编程的区别。面向对象编程,是把程序的工作看作是不同类之间的相互协作和相互调用,通过建立不同的相对独立的类,使得它们之间进行交互的同时又保留一定的独立性,降低程序的耦合性,提高程序的可扩展性。面向对象和面向过程两种编程方法,没有一定的谁比谁更好,只是在面对不同的问题时各有优劣。在本单元作业中,我的设计并不是很好,拓展性也不是很好,而第三次作业所增内容不多才让我得以不用重构。对面向对象的编程思想,层次化的分析还不能很好的运用在编程设计中。

posted @ 2022-03-25 09:38  YanG2k17  阅读(39)  评论(0编辑  收藏  举报