BUAA_OO_Unit1_总结

刘伟哲-21371421 学生 2023-03-19 19:21:26

2023_BUAA_OO_Unit1_总结

本单元课程主要讲述了OO基本思想、递归下降法、正则表达式等内容。

作业为输入表达式,进行化简输出,第二次迭代添加了嵌套括号以及三角函数Tri,第三次迭代添加了自定义函数处理以及求导功能。

程序结构和架构设计体验

我的架构和程序结构思路是,先字符串层面预处理输入(删除空格符和\t,连续+/-合并为单个),递归下降法解析输入表达式结构为多叉树Expr-Term-Factor(求导的解析和化简此时同时完成,避免Function实现Factor方法,从而降低复杂度),其中Expr和Term均使用ArrayList存储各自的Term/Factor。

实际开发过程和研讨课交流中,我发现使用ArrayList实现Expr和Term,是不如HashMap的。我在第二次迭代发现这个问题,在第三次作业后的研讨课上达到顶峰(但是最后没有重构用HashMap啦),并由我作了小组分享与大家讨论。

Expr的HashMap terms <Term, BigInteger(常数系数)>
Term的HashMap factors <Factor, Integer(次数)>

HashMap合并同类项和合并因子的方法类似,逻辑简单
从数学本质上说,加法和乘法都是无序的,满足交换律。HashMap满足这个特性,但ArrayList无法体现无序性(化简复杂)。

第一次作业,从开始到公测提交,花了我将近30h。我完成了预处理输入,Parse(递归下降法) Lexer(正则表达式)完成数据结构。组织Expr-Term-Factor的ArrayList数据结构。
第二次作业,高估了自己的能力,以为能下午+晚上写完,结果通宵到了凌晨3.(开学前还刚打了美赛,这学期开局太哈人了),惨痛的教训!最终完成了三角函数模块(嵌套括号是第一次已经实现的)。先是无脑在Expr、Term、Factor中添加boolean neg属性标记正负,后续发现Expr和Factor根本没有正负属性,Term的neg属性也被用*-1实现。
第三次作业,下午+晚上完成了,较为简单,但是强测后为了debug花了10h(后续bug中会提到)!!!

以下是我的Git部分提交,从中可以看出Unit1的苦难曲折,以及对于远程merge/rebase的不熟练。

img

度量分析程序结构

我的总代码行数为901行,下图为我的UML类图。

img

观察上面的UML类图和下方的复杂度表,可发现我的Term类过于复杂,耦合度。具体地,其中Term.like()过于复杂,导致Term类与其他类耦合度过高。由于我使用ArrayList实现Term的组织,在同类项合并、判断时过于复杂,此过程中参考了StackOverflow的实现(如何判断2个ArrayList的元素无序相同)。该问题涉及到因子合并、同类项判断,三角函数相等。

img

img

bug分析

由于架构不够优秀,没有写全自动化评测机。非常地遗憾,本人在三次测试中,强测都出错,只有最后一次互测没有被hack。

第一次作业没有处理好类似-x**2,整体neg处理有误。
第二次作业后发现deep clone出现问题。
第三次作业在多层嵌套三角函数时,由于使用toString字符串判断表达式以及三角函数相等,出现隐蔽的bug。

hack分析

我在第三次互测时,借助ChatGPT,使用Python快速开发了手动输入的半自动评测机。
但并没有实现自动化,即未实现表达式输入生成功能。
使用手动构造样例的方法,测试房友程序。

我的测试策略并不那么高效(未完全自动化)。由于时间精力问题,没有结合被测程序的代码设计结构来设计测试用例。

心得体会

嗨呀,现在是绽放的青影的心得时间啦。

我在本单元中彻底领悟到了时间分配的重要性。第二次迭代时,我高估了自己程序质量以及自己的coding能力,导致通宵到凌晨3点(然而最后助教第二天早,把ddl从中午12.延长到了晚上8.,但是我那个时候已经通完宵啦)。本次通宵导致我的免疫力下降,通宵当天感染甲流,现在还没彻底康复。。。

我也了解到了Technical debt的含义。我在第一次作业的时候就开始纠结,Expr Term Factor的neg符号问题,直到第三次作业时,才完全想通。如果我在第一次作业开始时,就彻底想通这个问题,那么就不会出现符号相关bug,也会减少后续开发时间(刚开学参加完美赛没有休息恢复过来,脑子也很乱,当时无法解决此问题)。

最后我想谈谈“人月神话”。不是在OO课程中,这个思考是我从开学前参加的美赛得到的(在这里作阶段性总结,我认为是合适的)。我的美赛队伍共有3名同学,其中我负责编程(实际上几乎是我独立完成了建模和编程工作)。在参赛的4天时间里,我花了相当长的时间和队友介绍思路。由于是初次参赛,且沟通效率低,最后严重影响了完成质量。在大型项目中,人力配置管理是十分重要的。

...全文
29 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

442

社区成员

发帖
与我相关
我的任务
社区描述
2023年北京航空航天大学《面向对象设计与构造》课程博客
java 高校 北京·海淀区
社区管理员
  • 被Taylor淹没的一条鱼
  • 0逝者如斯夫0
  • Mr.Lin30
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧