第一单元总结

第一次作业

一、程序结构

 

从类图中可以看到,一共也三个类,其中MainClass完成主函数、表达式输入及输出、解析表达式等任务,而Qiudao则是对各个因子进行的求导操作,Cal处理了过程中的计算问题。由于刚接触Java语言,也不太懂什么是面向对象思想,所以程序整体来说还是比较面向过程的,也并没有用到继承、接口之类的东西。

 

其中复杂度比较高的方法有MainClass.main、MainClass.shuchu、Qiudao.findxs,且类之间的耦合程度较高,代码结构不太好。

二、程序bug分析

非常幸运的是,我的程序在强测环节和互测环节并没有被查出bug。

对于表达式的处理,由于只涉及到幂函数,因此只需要设置1个pattern,对输入的表达式不断用pattern进行匹配,再对匹配到的字符串进行处理分析。但用正则时有一点需要注意,那就是大正则是不可取的。我一开始就是企图用一大串正则匹配整个输入,结果爆栈了。合理的做法应当是每次只find()一个项,以及通过项与项之间的连接解析字符串。

在数据结构方面,我一开始用的是ArrayList,但在后来优化的时候发现合并非常麻烦,于是果断放弃,学习并采用了HashMap。通过将指数作为Key,可以快速地找到指数相同的项,以实现合并同类项的目的。

三、互测分析

本次互测中我的策略就是专盯输出这部分。大正则容易爆栈或者出错,小正则容易漏情况,这都是经常出现bug的地方。同时,在输出时由于性能分的存在,x、-x,0等情况也都容易出错。

我按照每个人程序的代码设计结构分别构造被测样例,进行提交,有效性不错。同时,我也使用了发现自己程序bug的测试用例,也确实发现了一些bug。

四、应用对象创建模式

本次作业中可以创建一个幂函数类,幂函数类中有其求导规则,一个表达式类,使用工厂模式对输入字符串进行处理,生成幂函数对象装进表达式类中,最后对表达式求导,即调用每个幂函数成员的求导规则。

五、设计问题

本次作业是主要在面向过程编程,而非面向对象。

 

第二次作业

一、程序结构

 

在第二次作业中,我重新推翻原有架构开始重新设计,对于这一次的作业新要求——支持简单三角函数sin(x),cos(x),允许表达式的项由多个因子相乘,我建立了Exp、Term、Nest、Func、Error,依次表示表达式、项、因子、因子的函数和错误处理功能。

优:对于这样能对输入字符串进行更清晰的处理,也使得代码更具有可拓展性(可在此基础上添加别的函数功能)。

劣:没有对各种组合规则的求导进行可拓展性设计,造成第三次作业代码改动较大。

 

    有较多方法都过于复杂,应将方法功能进一步分解,提高代码可读性,Term类与外部类耦合程度较高,此处还有更大的优化空间。

二、程序bug分析

本次作业中,我的程序在强测环节和互测环节并没有被查出bug。

在中测提交和我的自我测试中,这次作业的出错总体来说还是比较少的。原因主要在于结合了上次互测屋中其他同学的优秀设计经验,应用面对对象思想重构代码,对输入字符串进行更清晰的分类处理。

三、互测分析

这次作业大家的设计复杂度剧增,加上第一次互测的经验,很多简单的测试比如空输入等没有成效。于是我采用了自动评测的方法进行测试,我用到了Python中一个强大的第三方包——SymPy,可以进行复杂表达式的求导运算以及判断两式是否等价,用写脚本进行批量测试,Java程序的输出与SymPy的输出进行比对,但最后仅仅找到几bug。本次作业中并没有结合被测程序的代码设计结构来设计测试用例。

四、应用对象创建模式

第二次作业中加入了乘法规则,应该针对此建立各种组合规则类,在类中创建他们的求导方法,增强对其余各种组合规则的可拓展性。

五、对比优秀作业

没有建立各种函数子类,使得Nest类过于庞大,代码不够简洁。

 

第三次作业

一、程序结构

 

优点:建立了Exp、Term、Nest、Func、Error类,对表达式各层次进行处理求导,代码逻辑结构较为清晰。

缺点:没有建立各种函数子类,Nest类方法过多,同时没有采用继承、实现接口使得代码层次性较弱。

 

没有建立各种函数子类,使得Nest、Term类过于庞大,类间聚合度过高,代码不够简洁。

二、程序bug分析

在强测中我没有被发现bug,但在互测中被hack了8次,全都是多层括号嵌套的性能优化处理导致的cpu超时,这确实是我的一个疏漏,在优化性能的同时未考虑到程序的运行时间,将Exp.huajian删除后,在输出的同时同步化简会明显缩短代码运行时长。

三、互测分析

在互测中我依旧采用了自动测评的方式,本次作业中并没有结合被测程序的代码设计结构来设计测试用例。

四、应用对象创建模式

可创建如加组合项、减组合项、乘法组合项和嵌套组合项等类,类中具有他们自己的求导方法。

五、对比优秀作业

我这次在浏览其他同学的优秀代码时发现很多非常精妙的设计,值得学习,比如划分成加组合项、减组合项、乘法组合项和嵌套组合项,代码逻辑结构极为清晰易懂,能极大降低复杂度,减少bug的出现概率和debug难度。这些优秀代码真的很值得学习!

心得体会

第一单元总体还是比较入门的,重点在于熟悉Java语法特性、建立面向对象思维,为日后的多线程编程打好基础。

我在本单元中学习了Java正则表达式、BigInteger类、HashMap、重写与重载、继承与接口等等技术,并且慢慢开始理解了层次化架构和面向对象技术的优越性。真实感受到JAVA面向对象与C语言面向过程的不同。

同时,通过Checkstyle对代码风格进行规范使代码整体结构看起来更整洁更清晰易懂,基本上不会令看代码的人抓狂。

我目前还处于基础阶段,对于面向对象的理解可能还是只是停留在表层,甚至可能会有误解,这就需要进一步的学习和练习,在一次次实践中总结经验与教训。希望以后能写出更加面向对象的程序。

posted @ 2020-03-18 19:12  habbbbbbq  阅读(185)  评论(0编辑  收藏  举报