OOpre 课程总结

22230604-艾俊辰 学生 2023-11-04 18:44:46

OOpre代码总结

一、架构及重构

1.最终架构

img

其中Bottle、Equipment作为父类,Commodity作为接口 (虽然好像没什么用来着),Tool作为封装函数的中转站,Fightlog作为战斗日志的储存,Store作为单例。

2.架构调整

(1) Fightlog的产生

最初的fightlog作为main类当中的一个Arraylist用于存储有效的日志,AOE时每次遍历挑战者列表挑出处于战斗状态的挑战者,极大地减省了调整架构的时间。但是最后发现有一个未给出数据的中测点死活过不了(乐),最终不得不在ddl前一天晚上重构,将进入战斗状态的挑战者和有效日志单独开两个列表加入fightlog类当中,并将寻找对应战斗日志的函数也搬入其中,然后就过了(鉴于笔者半夜重构脑子不清醒没做好版本管理,于是在强测数据点出来之后也没办法找出之前版本的错误(跪
美中不足的是,对于fightlog的加入这部分函数,仍然在Tool这个函数中,没有做到功能的完全独立。

(2)Tool的产生

Tool类的产生于一个函数不能超过60行一个类不能超过500行的checkstyle限制,不得不将所有相关函数移入一个新的类作为所有函数的中转站。

3.优秀代码对比

路漫漫其修远兮,尚有很多不足亟待改进。对于接口、继承和模式的使用,似乎更多只是形式主义,在具体的代码实现中并没有做到物尽其用。
对于Adventure这个将将500行的类,很多函数其实都可以建立一个新的类用于封装,(例如对于背包等的操作,相比于直接用一个Arraylist加在Adventure类下,用一个Bag更方便也更明晰)

二、JUnit

最大的感受是,我怎么还要deJUnit的bug(不
但还是谢谢JUnit,确实找出了一些bug

1.关于手搓数据的特点

数据搓复杂了对自己不好,数据搓简单了对程序不好
因此最合适的构造数据方法:扒拉一组中测数据并在此基础上进行更多指令的输入

2.JUnit的第二个妙用

在de出一个bug并进行相应修改后,可先在JUnit中进行小范围的输出确保没有问题再进行整个的数据运行

三、一些心得体会

1.关于面向对象还是面向过程

起初只是认为面向对象就是将不同的对象分开处理,所以在最初的代码架构中将Adventure、Bottle、Equipment等全都分开处理,并未实现层次化。在之后的学习中,逐渐认识到了什么是面向对象编程,将操作行为归类到不同的对象当中。比如添加新的药水、新的装备等操作都应该是在其对象所属的类中,建立相应的添加方法,将其存入到各自的容器中。
简言之,面向过程更加注重于对于所学知识的掌握和应用,而面向对象则需要在掌握新知识之后选择如何应用、如何架构,这是更需要思考和斟酌的。

2.代码框架的合理性和高效性

详情见上。没有合理的面向对象框架使得在迭代的过程中,拓展新的功能十分繁琐复杂,难以避免代码复用等导致出现一些细枝末节的bug,给调试带来了极大的困难。所以好的代码框架可以让迭代事半功倍,高校高质量完成迭代任务。
因此在每次写代码过程中,要提前预留好迭代、扩展的空间,不能够仅仅以完成目前的目标为代价(eg.留最后三行空间为给下一次迭代)

四、对OOpre课的建议

希望老师可以将关于代码风格和重构的部分提前,或者将这部分内容穿插在几次课程内容中进行讲述。这样做有助于同学们及时更新和改进自己的代码,不必在某一次作业中进行大幅度改动。另外,对于继承、接口、工厂模式等部分,似乎不需要用相应的课上所学也可实现?我个人认为课下作业无法体现出这些方法的便捷程度(譬如我一直在思考学习工厂模式和接口的意义是什么……)也许明年的OOpre可以做的更好(?

最后的最后,感谢所有老师和助教的辛勤付出和耐心答疑,也感谢在无数次debug中没有放弃的自己~

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

242

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象程序先导
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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