OO第一单元总结

一、作业分析

第一次作业

思路

  1. 采用训练所提供的框架,并且具体实现依照强生同学在讨论区发的帖子。先是采用lexer对我们的输入表达式进行读取,把他们都读取成为一个一个“因子”,包括各种运算因子和计算符号还有小括号之类的。
  2. 然后我们用parse类来对已经读取出来的一个一个“因子”来解析。具体解析方式是递归下降法,入口是parseExpr,然后对于每个Expr在进行parseTerm,解析出来的Term在用parseFactor方法解析成为一个个Factor。
  3. 针对不同的Factor我们定义了不同的“因子”类,这样再进行了parse之后我们可以视作解析出来了一棵表达式的树。
  4. 解析出来之后我们就可以进行展开输出了,我是先去将所有的因子转换成为coe*x**index的同一形式,然后再把表达式因子通过Arraylist<>这个容器包装成一整个表达式。
  5. 转换成功之后的输出我采用库函数自带的System.out.println(),所以是需要去重写我们的toString函数,重写之后就能够是的表达式按照我们所需要的的形式进行输出了。

UML类图

Statistics

Metrics

通过一些统计工具的统计,可以发现自己的有些地方的代码复杂度是有待提高的,就比如这次作业中的ForTerm.toString()方法,ev(G)过高了,说明这个方法中toString()实现的不是很好,流程复杂了,所以就很容易在这种地方出现bug,不出意外,这次作业我的bug救助要出现在这个地方。

Bugs

这次作业十分遗憾因为自己卡最后的时间提交,结果因为自己没有用官方包进行读入而导致中测都没有过,很可惜。

除了这个,自己在做的时候也找到了不少的bug。其中印象最深的还是空指针,自己刚发现空指针的时候很懵逼,先是自己上网查了下,然后又向强生同学求助,才发现是我自己在Term的构造方法那里出问题了,在有参数的构造中没有去声明新的空间,导致出现了空指针的情况。

还有比较大的bug就是自己在表达式toString()的上面,自己在如何处理指数和系数的优先级上出现了些问题,导致会有些奇奇怪怪的输出。

第二次作业

思路

第二次作业在第一次作业的基础上有较大的跨越,开始我是想在自己第一次作业的基础上“缝缝补补”过去的,打算采用先去预处理整个函数式,将我们的自定义函数和求和函数处理掉再去用第一次作业的处理方式,这个时候只需要我们升级下第一次作业的配置使得她能够处理三角函数之后按道理就能够勉强过去了,开始的话我是先做了添加三角函数类,再把我们的基本的“通项”加上我们的用于处理三角函数的HashMap。然后就要解决怎样去处理掉自定义函数和求和函数,之前想的是去暴力进行字符串替换,但是自己进去写的时候才意识到要考虑的情况太多了,自己写了挺长一段时间之后还是没有很好的解决,最后决定换成预解析写完这次作业,预解析的话思路就会简单很多了,就是先解析我们每一行固定的格式,然后每输入一行解析计算一行,又由于之前我已经解决了对于三角函数的问题,所以就很好完成了这次的作业。

UML类图

Stastics

Metrics

这里还是照样自己的toString方法十分的复杂,自己还是没有找到一个很好的方式去很简洁的实现字符串输出,全程都是使用十分简单粗暴的条件判断做的。

还有就是我的解析方法,这个我自己觉得有些无法避免,毕竟这个方法承担着最复杂的表达式解析任务。

Bugs

有一个bug是当我的三角函数的处理,当我的三角函数里面是一个“0”值时候,在term这个类的toString方法会把他视作“”(空的),由于我把空字符默认成“1*x**0”所以是会输出“1”,这个bug一直到最后也是没有发现。在第三次作业才发现的。

在做的时候也出现了不少的bug,其中有因为构造的习惯问题导致的“空指针”,也有因为没有理解“深克隆”和“浅克隆”的区别,出现了一些不能解释的输出。

第三次作业

思路

思路和第二次作业是十分相似的,预解析模式第三次作业在第二次的基础上知识需要去解决如何实现三角函数里面的表达式因子嵌套问题,我的处理就是去掉上面那个tri类,而是用已经存在的Formula类来代替它的位置,在去处理好细节就好了。

UML类图

Statistics

Metrics

这个复杂度和统计和第二次作业大同小异,此处就不再赘述了。

Bugs

大部分的问题在上次作业已经解决了,这次的克隆也全都改成深克隆了,并且这次也基本没做优化,所以最后基本上没有什么新的bug,但是性能分是完全没了。

大家一些典型的bugs

  • 深克隆:首先最典型的还是我们关于容器的深克隆的问题,在开始美哟助教和大佬在群里的讨论前,像我这样的还完全没有意识到这个问题的存在,在看到群里的大家的讨论后再去求助同学才真正的解决我自己的这个问题。
  • 正负号的处理:这个从第一次作业开始就出现的问题,不过开始的第一次作业只是因子、项和表达式前的正负号要考虑,大家在这里一般也是考虑到了,但是在后面几次作业中对于出现在我们三角函数之类的因子指数上出现正负号的处理还是出现了不少的问题,自己在第二次作业这上面也出现了bug,没有很好的处理掉指数带正负。
  • 强行进行字符串替换:字符串替换一旦不小心就容易出现不太好察觉的问题,就像不少同学直接把”x^1“替换成”x“就会出现把我们的”x ^11“视作”x1“的问题,所以用字符串替换的时候还是要小心。
  • sum中的大数:在第三次作业中我们的sum函数中是可以出现BigInteger的,很多同学是使用的int,就被hack了。

二、心得体会

  • 算是自己和面向对象这种思想和我们java语言的第一次正式的碰面,可以说是有些手忙脚乱和不知所措,自己之前没有这方面的基础且没有怎么认真的做好pre,加上自己这几周的事情确实很多,这三次的成绩可以说是惨不忍睹,后两次作业都是用预解析过去的,下个月的作业一定要重整旗鼓好好做,认真拿到自己能够拿到的分数。
  • 在完成作业中能够慢慢体会到整个面向对象的思考过程,在研讨课与和别人的交流中了解了大家的架构,切身感受到了一个好的架构对于我们整个作业迭代的便利与自然,真的不能一上来就动手写代码了,这样思路容易卡住,造出来一个勉强能过本次作业的也会为以后的重构埋下伏笔 。
  • 下个电梯月,希望能兼顾好完成作业和其他事情,好好活过去,来吧。
posted @ 2022-03-26 15:52  谷福胜  阅读(25)  评论(0编辑  收藏  举报