OO第一单元总结

2019北航OO第一单元(表达式求导)总结

1. 第一次作业

1.1实现思路

第一次作业需要完成的任务为简单多项式的求导。首先对输入的整个表达式进行了格式判断,如果是非法输入,直接输出WF,否则去除空格然后一项一项读入并求导,将求导结果保存到arraylist中,进行合并同类项,输出。输出中可以进行相应的输出格式化简处理,比如针对指数为0、1或系数为0、1、-1等情况。

1.2代码分析

UML类图如下

第一次OO作业,对面向对象的理解不够深刻,创建了7个类,思维还留在C语言中,这7个类像是C语言中的函数,虽然实现了功能,但是代码结构存在非常大的问题。

Metrics分析

 

代码结构存在较大问题,没有明确类的概念和用途,甚至把类作为函数使用。Everyterm是一个关于项的类,但是只存储了项的基本信息,输出、求导、合并本应都写入这个类,但是我没有。

1.3公测

公测只过了5个点,并且没有进行正项提前扣了一部分优化分。

1.4互测

没能进入互测

1.5bug修复

发现自己的问题,在输出的化简处理上出了问题,遇到‘0’这样的项,没有输出符号直接输出了0,导致最后的表达式错误。

1.6总结

第一次作业并不理想,主要还是没有正确理解和认识“面向对象”的意思,思维停留在C语言中,没能有一个很好的代码结构。最后没有认真检查自己的代码,也没有进行充分测试就进行了提交。关于0的错误输出很容易就能够自己测出,或者只要我细心看一看我的代码就能够发现自己少处理了这种情况,但是我没有。希望可以吸取第一次的教训。

2. 第二次作业

2.1实现思路

第二次作业相比第一次作业增加了sin(x)和cos(x)。仍然使用了大正则先进行格式检查,建立了一个Poly类用于处理多项式(进行多项式的分割、输出等),建立Term类用来保存项的信息以及一些和项有关方法(如求导、输出),以及有一个RegExp类用来保存一些正则表达式(这个类有些多余了)

2.2代码分析

UML类如下

 

相比第一次而言对类有了更明确的认识,能够成功的创建类了,代码架构有所改善。

 

局部仍旧存在一些问题。

2.3公测

通过了全部测试点,但是并没有进行很好的优化,只简单进行了合并同类项处理,没有处理三角函数化简部分,扣掉了一部分分数。

2.4互测

共找到2处bug,寻找别bug的主要方法是自动生成数据以及读代码。大家吸取了第一次作业的教训之后,找bug就不那么容易了,在我的room中自动生成数据基本失效。后来采用了读代码的方式寻找bug,坏处是比较累,效率不是很高(但自动生成真的找不到啊,是我太菜了),但是能够准确定位问题,大概就是要么找不到、要么一找一个准。找到的bug分别是:格式处理出错(没能成功判断WF),运行时错误(在字符串的处理上存在一些问题导致访问越界)

2.5bug修复

互测中身中3刀,经过debug发现是同一错误,也是格式处理上的问题,因子之后的空格没处理好导致输出WF,又是一个因为粗心而产生的错误!!!

2.6总结

吸取第一次作业的教训,重构了代码,虽然结构上仍有不足的地方,但相比于第一次而言有进步了。并且在互测中通过读其他同学的代码,也收获不少。但是程序的可扩展性不强,导致我第三次作业再次重构了代码(哭)

3. 第三次作业

3.1实现思路

看到第三次作业时真的觉得无从下手,因为增加了嵌套内容,关于代码架构前后尝试了2天左右,过程比较痛苦,尽管最后代码架构也不太完美。除了主类外,新建了Poly类来处理多项式、Term类来处理项、Nature类作为基础因子类(父),Comb继承于Nature的嵌套类。对于格式的检查采用的是边存储边检查的方法,拿到一个多项式,循环处理项,在项中循环处理因子,进行一些存储。然后在每个类中进行了单独的求导和输出处理。

3.2代码分析

UML类图

 

 

 

有一些方法的耦合度比较高,处理的不太好。这次程序是肝出来的,因为在架构的思考上费了很多时间,导致后面写的非常急,最后提交的也十分匆忙,为了满足checkstyle的要求,缩短方法的行数导致我的方法写的有些乱,耦合度也很差,代码中甚至有部分重复内容,这些都需要进一步改进。代码中还存在的一个十分大的问题就是构造函数,对字符串的处理,我整个将它放入了Poly类的构造器中,这个构造器包含了2个大循环,这使得这个构造器十分庞大,并且违背了“构造器”本身应有的功能,这是第三次作业中存在的最大问题。在研讨课上助教介绍了状态机的方法,学到很多。

3.3公测

有一个测试点没有通过,问题出在嵌套类型的存储上,会出现问题的样例为sin(sin(x)^2)这种,嵌套中包含指数的类型。只进行了一些非常非常简单的优化。

3.4互测

由于本次代码都比较复杂,没有进行逐个读取代码的方法,自动生成了一些测试数据,以及手工构造了一些易错情况。主要错误情况有,空格处理不当,无法识别指数,嵌套层数过多导致的超时,以及sin(-9)这种带符号的正确嵌套形式无法识别等问题。

3.5bug修复

互测中身中7刀,经过分析主要分为两种bug。两种bug都会在嵌套中包含指数这种情况出现,我在写程序时忽略了这种情况。第一种识别错误,无法识别sin(sin(x)^2)中的“^2”从而输出WF,考虑情况不周。修改了判断条件后解决。第二个问题是嵌套类型的存储错误,在嵌套类型中我设置了一个变量用来存储嵌套的内容的指数,也就是上面的括号内的sin(x)的指数2。但是由于我不能很熟练的使用继承,导致我把外层函数的指数修改了,存储时错误,导致后面求导、输出都错了。通过修改传递的参数的方法解决这个问题。

3.6总结

第三次作业,让我对类的使用有了更加深刻的认识,也更加熟练了,虽然写程序的过程有些累,但真的学到了好多新的知识,掌握了一些新的用法。通过第三次作业我认识到,有一个好的代码架构是多么的重要!也终于知道什么是面向“对象”,这次作业使我走出C语言环境,真正进入了面向对象的学习。

4. 总结

经过了3次作业、三周的训练,进步真的是很大的,遥想3周以前我还是一个什么都不懂的小白,虽然现在仍旧是入门阶段,但是相比于过去的自己已经有了很大的进步了。学了OO我终于知道什么叫“人的潜能是无限的”!OO的任务量很大,总觉得身上背着OO在艰难的向前行走,但是还是走过来了,压力大是真的,但是学到知识也是真的吧,OO一直在推动我向前啊。虽然学起OO有些吃力,但是还是会继续坚持下去的,希望能顺利渡过后面的作业与考试吧。

转载于:https://www.cnblogs.com/baoweitong/p/10604662.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值