BUAA OOPre总结
本文最后更新于 2025年3月19日 上午
BUAA 2024 OOPre总结
架构设计
最终架构
最终作业架构的设计如下(Bouml软件制作):
- 主函数为
Main(),调用Solver类 Solver类接收输入,内含一个ArrayList<Adventurer>,通过输入调用对应函数对ArrayList<Adventurer>进行处理Adventurer类继承Employer,Employee接口Adventurer类拥有Bottle,Equipment,Fragments的组合,表示该冒险者拥有的药水瓶,装备,碎片AdventurerGame依赖于Guard接口,Guard接口由Stn,Flm,Stn,Frz,Wnd五种类(怪物)实现TreasureFactory依赖于Treasure接口,Treasure接口由StnTreasure,FlmTreasure,StnTreasure,FrzTreasure,WndTreasure五种类(宝物)实现
迭代调整
- 第三次作业实现了继承,将
Bottle类实现为父类,HpBottle,AtkBottle,DefBottle类作为子类继承其方法 - 第五次作业新增
Fragment类,并撰写了一个Solver类来处理输入,由于评测机的JUnit测试似乎不支持文件重定向,将Solver类调用的函数修改为以字符串为参数 - 第六次作业新增工厂模式生成
Treasure类,观察者模式实现Employee与Employer接口
JUnit使用心得体会
在进行JUnit测试的过程中我们要实现两个目标:
- 代码覆盖度高,这需要我们撰写出可以覆盖足够多情况的测试样例
- 排查代码隐患和错误,考虑足量多的极端情况,比如第六次作业中可能出现被雇佣人攻击雇佣人的情况,这时处理
normalFight的顺序非常关键
JUnit可以降低对复杂指令的检查难度,例如chainFight中计算被攻击者的队列,我通过不同的输入样例确保了递归在次数为5会停止
在对JUnit的探索中,我认识到assert语句的重要性,它可以减少花在排查输出结果的时间
JUnit还可以搭配自动化生成测试数据的程序,虽然不能和正确程序对拍,但是对于理解题目要求与测试覆盖率都有很大的帮助
OOPre心得体会
我从OOPre课程中学到了层次化设计,初步理解了面向对象思想,并掌握了Git,Junit等工具的使用
以我的理解,面向对象即把问题中所有的事物都"抽象"成"对象",通过封装,继承,多态的概念设计程序,这样的思路极大地提高了代码的可扩展性与可维护性,这些都是我在C语言中的学习中没有机会掌握的
另外,通过这门课,我的debug能力得到了很大的提升,通过使用JUnit和BreakPoint排查了很多错误
对代码的重构也是一件很重要的事,checkstyle在敲代码过程中会对重复代码和冗余的代码提出修改,如果重复出现在同一个类中,我们可以重复代码提出来作为一个单独的函数;冗余代码可以根据IDEA提示修改,例如删除一个ArrayList中元素的操作,if (...) remove(...)的代码段可以用一句removeIf()替代.这样,代码才能保持足够的清晰可读性和可维护性
对OOPre课程建议
请加入互测功能
BUAA OOPre总结
https://meteor041.git.io/2024/11/01/BUAA 2024OOPre总结/