OO第一单元总结

刚开学初步接触面向对象思想,加之第一次写博客,疏漏之处还请多多批评指正。

一、架构分析

第一次作业

由于还没深入接触面向对象思想,第一次作业仍沿用的面向过程的做法。结构十分简单,只有一个类,类的构造函数用以处理输入的字符串,calcDiff()用来计算导数。当然这种做法仅限于第一次作业这种较简单的情况,这也为后来重构埋下了伏笔。

第二次作业

要求简述:在第一次作业的基础上增加了三角函数sin(x)和cos(x),要求是三角函数保留字内不可以有空格,而且三角函数的参数里只能是x,不能是其他函数,除此之外,因子之间组合形式更加复杂,项可以是多个因子的乘积,而且第一个因子如果是1的形式可以简写为+,-1可以简写为-,其他要求和第一次相同。

实现思路简述:三个类分别表示多项式、项、因子,项和因子创建Arraylist来储存,每一项都可以固定为常数幂函数sin(x)*cos(x)的形式,这样进行求导。Factor类用于获取因子类型,实现了获取系数和获取指数的分离。常数因子,幂函数因子,三角函数因子,表达式因子都继承于Factor,并根据不同需求重写Factor中的方法。不过因为第一次作业和第二次作业的跨度略大,我花了很长时间才想清楚架构的问题。因为局限于面向过程的思维,最初我对于用什么类存储表达式,项和因子没有构思清楚,想要用统一的类存储term,expression,factor。结果在后面构建代码时给我的进程造成了很大的障碍,同时对于term,expression的读取方式也没有区分,统一都使用一种方法读取。使我的代码缺乏层次性,说明我面向对象的思想还亟待提高深化。

第三次作业

度量分析

第三次作业加入了嵌套因子,导致正则方法提取失效。我选择了用多个小正则构造来判断输入是否合法。在判断输入合法性时,先进行括号匹配,若有多层括号嵌套,若括号不匹配的话直接判定为非法输出。括号匹配的情况下,逐层判断,每次将当前表达式视为只有一层括号嵌套,递归判断。设置Error类用于输出错误提示,PolyBuilder用于表达式构建(相当于一个容器),PolyChecker进行表达式是否合法的检测,DiffPolySimplify则用于模块的计算和简化。

而在进行求导运算时,这种方法无法准确提取项,便手动根据括号和符号,每次提取出表达式,再将表达式分割为因子,运用链式法则,进行逐个求导。但是第三次作业个人感觉核心并不在于求导,而在于格式筛查,也就是对于“wrong format"的判断,这点在研讨课上听大佬分享时听说采用递归下降法比较好。

二、bug分析

第一次作业时就犯了一个比较憨的错误,没有将^替换成**,还是太不仔细。第二次作业中测有测评点没过,后来发现是递归时判断顺序从左到右导致运算顺序改变致使发生错误。

第三次作业时bug可谓天花乱坠,往往真正的wrong format没有判断出来,不是wf的input又被错判成了wrong format。这里总结了一下错误类型,一是由于我本人审题时的疏忽大意,没有考虑到负指数和零指数的问题,致使x**-1和sin(x)**0这样的被误判成了wrong format.

二是格式筛查不仔细,诸如

x^2和xcos(x)

这样明显错误的输入却正常输出了求导结果。

三是对前导符号处理不够细致,诸如

1*--1,1*---1,sin(- 30)

这样的输入没有输出wf.这些都是很遗憾的地方,后来通过请求同学的帮助和借助评测机重新把标准格式理清了一遍,这才让千疮百孔的代码有所好转,可谓殊为不易。

三、发现bug的策略

首先是把我所能考虑的bug提交一下,剩下的因为能力有限只能借助于测评机了(捂脸)。征得同学的允许使用了一下基于py的测评机,将打好的jar包放在工程下运行即可。在python中输入自己构造的测试数据,通过调取每一个文件的Main类进行测评。随着课程深入,第二单元我争取自己手动搭建一台像样的测评机,弥补第一单元的遗憾。

四、重构经历总结

两次迭代基本都进行了彻底的重构,第一次面向过程的思想应付代码量不大的第一次作业尚可,但很明显到后面就落伍了,致使我到第二次作业不得不迫使自己加快吸收面向对象的概念,总算是多写出了几个类,引入polytree将输入先转为后续表达式,进而转为表达式树。第三次作业是在第二次基础上完成的(虽然基本相当于重构),一开始对如何嵌套因子没有头绪致使走了不少弯路。有了嵌套,我无法仅仅通过简单的正则表达式从一串表达式中提取我所需要计算的项,因此前两次的架构是无法适用第三次作业的。所以我又引入了PolyChecker等几个类,寄希望于增加因子的可扩展性。

五、感想体会

OO第一单元,刚开始接触面向对象程序的设计,难免会水土不服,从面向过程的程序设计思维逐渐转到面向对象的程序设计思维,逐渐熟悉用类来管理数据、用容器来管理对象,也慢慢建立了程序鲁棒性的概念,这个过程虽然艰难但也很有意义。

一点较大的感受是,在进行新作业时,不是在迭代情况下的设计调整,而是每一次都进行完全的重构,花费了较多的时间和精力,这是在程序设计时没有考虑到扩展性的结果,所以以后的单元一定要早做规划,注意代码可扩展性。

本单元的层次化设计也做的不够好,只在最后一次作业中用到了接口实现,层次化设计是面向对象程序设计与构造的重点之一,按照数据或行为建立抽象层次,对多层次对象进行归一化管理,将大大有利于程序的编写,更加符合“高内聚 低耦合”的设计理念。在之后开始每次作业前,都需要考虑好不同类型项之间的层次关系,这样可以事半功倍。

总之OO的学习也可以说是”痛并快乐着“吧,第一单元我的遗憾有很多,跟大佬们相比在代码优化方面我基本也是无所作为的状态,类似于工厂模式之类的方法也并不熟悉。路漫漫其修远兮,要跟大佬们学习的东西还有很多。未来我一定要多研读他人博客,取长补短,深化自己面向对象的思想和本领,真正实现从面向过程到面向对象的转变。

posted @ 2021-03-28 01:46  Charlie_Cosmos  阅读(47)  评论(1编辑  收藏  举报