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五种类(宝物)实现

迭代调整

  1. 第三次作业实现了继承,将Bottle类实现为父类,HpBottle,AtkBottle,DefBottle类作为子类继承其方法
  2. 第五次作业新增Fragment类,并撰写了一个Solver类来处理输入,由于评测机的JUnit测试似乎不支持文件重定向,将Solver类调用的函数修改为以字符串为参数
  3. 第六次作业新增工厂模式生成Treasure类,观察者模式实现EmployeeEmployer接口

JUnit使用心得体会

在进行JUnit测试的过程中我们要实现两个目标:

  1. 代码覆盖度高,这需要我们撰写出可以覆盖足够多情况的测试样例
  2. 排查代码隐患和错误,考虑足量多的极端情况,比如第六次作业中可能出现被雇佣人攻击雇佣人的情况,这时处理normalFight的顺序非常关键

JUnit可以降低对复杂指令的检查难度,例如chainFight中计算被攻击者的队列,我通过不同的输入样例确保了递归在次数为5会停止

在对JUnit的探索中,我认识到assert语句的重要性,它可以减少花在排查输出结果的时间

JUnit还可以搭配自动化生成测试数据的程序,虽然不能和正确程序对拍,但是对于理解题目要求与测试覆盖率都有很大的帮助

OOPre心得体会

我从OOPre课程中学到了层次化设计,初步理解了面向对象思想,并掌握了Git,Junit等工具的使用

以我的理解,面向对象即把问题中所有的事物都"抽象"成"对象",通过封装,继承,多态的概念设计程序,这样的思路极大地提高了代码的可扩展性与可维护性,这些都是我在C语言中的学习中没有机会掌握的

另外,通过这门课,我的debug能力得到了很大的提升,通过使用JUnitBreakPoint排查了很多错误

对代码的重构也是一件很重要的事,checkstyle在敲代码过程中会对重复代码和冗余的代码提出修改,如果重复出现在同一个类中,我们可以重复代码提出来作为一个单独的函数;冗余代码可以根据IDEA提示修改,例如删除一个ArrayList中元素的操作,if (...) remove(...)的代码段可以用一句removeIf()替代.这样,代码才能保持足够的清晰可读性和可维护性

对OOPre课程建议

请加入互测功能


BUAA OOPre总结
https://meteor041.git.io/2024/11/01/BUAA 2024OOPre总结/
作者
meteor041
发布于
2024年11月1日
许可协议