面向对象第一单元总结

(1)基于度量来分析自己的程序结构

第一次作业分析:

我的设计还停留在面向过程的阶段,总体的思路就是输入,处理,输出,仅仅相当于把一个面向过程的程序,分为三段,放进了三个类中。

 

mian类为程序的入口,负责接收输入,同时负责合并同类项。

Stringtrans类为字符串处理,主要通过先分割字符串,将输入字符串分割成项,使用正则表达式匹配,来提取信息。

Poly类负责储存系数和指数,由于第一次作业求导比较简单,因此内置了求导的方法。

Output负责输出,因为使用链表储存,所以先遍历所有的系数和指数,然后枚举出所有可能出现的特殊情况,进行处理。

复杂度分析:可见,main类和printout方法复杂度较高,在main类的构造方法中,进行了系数、指数的存储,又进行了合并同类项,其中这两步都使用了for循环和遍历操作,大大增加了复杂度。printout方法中,使用了大量if else语句来枚举所有可能出现的情况,不符合面向对象的思想。

第二、三次作业分析:

很显然第一次作业的设计无法满足新的需求,必须要进行重构,但是第二次作业的输入变的十分复杂,我寄希望于通过于第一次作业类似方法,分割字符串,正则表达式提取信息,导致我无法正常完成字符串处理,加上对表达式树比较陌生,因此没有顺利完成。到了第三次作业,我从同学那里学习了一些有关递归下降的方法,但是由于自己的懈怠和第二次作业留下的坑,导致第三次作业也无法正常完成。

当然,这两次作业不理想的最主要原因还是自己投入的精力不够,时间安排不够合理,在未来作业的难度会越来越高,我必须要重视起来,不能再像第一单元这样拖延了。

尽管最后只写了一个半成品,但是通过分析这个半成品,也可以窥探我程序架构不合理之处和细节上存在的许多问题。

Check类本质上是一个字符串处理的类,在提取字符串信息的同时,对可能出现的错误进行判断。

Buildtree负责建立表达式树,Tree类有两种类型,符号和因子。

Factor是因子类,通过继承,定义了每种因子,每种因子都提供了各自求导的方法。

Diff类对表达式树进行求导。

Simplify负责化简,但是缺少与其他类的耦合,基本只能完成对符号的一些化简。

Output类负责输出。

复杂度分析:由于代码没有完成,因此无法系统的分析复杂度,不过此次的复杂度与第一次类似,处理字符串依然是靠分割和正则匹配,不可避免的产生了大量枚举的情况。而我对表达式树的操作也不是很熟悉,代码思路不够清晰。

(2)分析程序bug:

对输入的形式理解不透彻,导致第一次作业遗漏了三次加减号的情况。

(3)bug发现策略:

在课下自测中,很多大佬都搭建了测评机,对于我来说搭建测评机还需要学习很多东西,而且,样例的有效性远远重要于样例的数量,与其构造大量模式重复的样例,不如仔细分析输入内容,寻找突破点。在本单元,我们可以使用递归的方法来分析输入,我们就可以找到诸如三个加减号连接在一起这样的特殊情况。

在互测阶段,阅读他人代码是一种有效的方式,比如第一次作业,如果发现对方使用正则表达式,可以尝试进行爆栈。但是阅读他人代码需要大量时间和精力,因此如何提高自己阅读代码的能力,能快速搞懂他人的设计思路,是十分重要的。

(4)重构经历:

由于没有面向对象的思维,重构是必须的,由于自己一再拖延乃至放弃,重构也是失败的。首先是输入字符串的处理,我输入处理的方法一直没有很大变化,导致程序越来越复杂,却依旧无法解决问题,在最后,我也向其他同学请教了一些递归下降的方法,将表达式分为表达式项,项,因子三个层次,上层调用下层,这种方法不仅简洁,在面对新的需求时,只要稍作改进就可以运行。有关输出方法的重构,在一开始,我是把化简的过程放到了输出方法中,导致输出方法有大量if else化简语句,在之后,我新建了一个化简类,输出类只负责接收数据和输出,降低了复杂度。

(5)感想与思考:

此单元的作业并不是十分理想,主要还是由于自己的懈怠,导致任务一拖再拖。通过第一单元的学习,我深刻体会到了此课程的难度,我必须端正态度,尽全力跟上课程的进度。其次,在写代码之前,我一直缺少清晰的思路,这导致编写代码时总是发现遗漏的需求,导致代码架构混乱,给适应新需求和重构带来了困难。最后,我也感觉到自己基础的薄弱,许多编程语言基础知识不够明晰,缺少代码编写技巧,这都对我的学习带来很多困难。

posted @ 2021-03-30 17:23  apakiser  阅读(53)  评论(0)    收藏  举报