2025 BUAA OOPre 课程总结

丁一博-24371341 2025-11-11 21:14:07

一、架构设计

继承与接口设计

项目最终UML类图如下:

img

采用模块化的思想,我的最终架构可以分为以下几个核心模块:

1. 入口与控制层

  • Main :程序入口,仅用于初始化Scanner、冒险者容器advs、关系管理器rm,并创建总控制器CommandUtil
  • CommandUtil :系统的总控制器,功能如下:
    • 控制:负责解析所有用户命令。它从Main接收Scanner,通过switch语句分发指令( "aa", "ab", "fight", "use" 等)。
    • 协作:作为协调者,调用 Adventurer 类的业务方法和 RelationManager 的关系处理方法。

2. 核心实体层

  • Adventurer :管理冒险者的所有属性和行为。
    • 属性管理 :管理基础属性(hitPoint等)及状态。
    • 物品管理
      • items :存储冒险者拥有的所有物品。
      • bottleBackpack :药水瓶背包,采用LinkedHashMap这一数据结构,通过重写removeEldestEntry方法,实现了“最多携带10个药水瓶,超出时移除最旧条目”的逻辑。
    • 技能与关系spells 存储学会的法术,superiorsubordinates记录雇佣关系。
    • 行为管理 :封装了addBottle, addEquipment, learnSpell, takeItem 等所有逻辑。

3. 物品与技能系统

  • Item (抽象类) :所有物品的顶层基类。
  • Usable (接口) :可用物品接口。
  • Bottle (抽象类) :继承于Item,并实现了Usable接口。派生出HpBottle等具体药水类。
  • Equipment (抽象类) :继承自Item。派生出ArmourWeapon (抽象类)。Weapon 进一步派生出SwordMagicbook
  • Spell (抽象类) :实现了Usable接口。派生出HealSpellAttackSpell

4. 关系管理模块

  • RelationManager :负责处理冒险者间的雇佣关系,提供关系的添加删除死亡处理等操作。
  • LrParser :配合CommandUtil 使用的递归下降解析器,用于解析"lr"指令,并通过调用rm 的方法建立雇佣关系。

5. 工具/辅助类

  • Factory:实现了工厂模式,用于创建对象实例。

架构调整及考虑

  • CommandUtil 的添加:最初对指令的处理全部由Main类完成,随着指令的增加,Main类变得过于臃肿,且超出代码行数限制,因此引入该类专门负责读取和解析指令,使Main类仅仅作为程序入口。
  • Factory 的添加:随着迭代的进行,BottleEquipment等都有了多个子类,这时需要根据某一物品所属的子类名来相应地创建对象,为了降低项目的耦合度,便添加了Factory工厂类来专门创建对象。
  • RelationManager 的添加:第六次作业引入了雇佣关系,需要管理各个冒险者之间的关系,为避免Adventurer类中耦合度过高,引入了该类来统一完成关系的添加、删除、查询等操作。

二、使用JUnit的心得体会

  • JUnit即“Java单元测试”,指针对每一个Java类(主类除外),都编写多个测试函数来测试该类的方法是否达到了预期的功能,并测试各种不同情况下方法的稳健性,可以检测Java项目中是否存在低级的逻辑问题。
  • 之前的程序设计过程中,我们大多是通过构造测试数据,将程序的输出与答案进行对比,来排除程序的问题;而通过JUnit,我们可以初步检验每个类、每个方法的正确性,从而减少测试的工作量。
  • JUnit促使我们思考边界情况。 编写测试用例的过程,也是对自己代码的再次检查。我们可以测试很多种边界情况,比如正常参数、null、0等,当然前提必须是满足题干中的数据范围。这一步能提前找出很多代码漏洞,极大减少了后期调试的麻烦。

三、学习OOPre的心得体会

  • 在OOPre的学习中,我掌握了Java的基本语法和常见的数据容器等。相比“原始”的C语言,Java语言明显更加现代,比如Java将C语言中复杂的指针替换成了“引用”。此外,C语言不注重类型的检查,有很多自动类型转化的例子,而Java却对此要求很严格,比如if和while的判断条件中必须是boolean类型,之前我们可能习惯了的if(a),必须再改成if(a!=0),此外还要多注意操作的某个对象是否为null,否则程序可能会抛出异常。
  • 我最大的收获是从“面向过程”到“面向对象”的思维转变。 之前我们大多在完成一道道编程题目,仅仅追求AC,而不关注代码可读性、可扩展性等等。而现在我们要迭代开发项目,这便要求我们保持良好的代码风格,提高程序的可读性等。
  • 在学习工程模式等设计模式时,我也感受到开发的规范性,原来这些方法都有对应的理论支持,而不是凭空想出来的策略。比如我在第一部分架构设计中提到的Factory类,就是对“工厂模式”的一次具体实践,它帮助我将“对象的创建”与“对象的使用”解耦,降低了代码耦合度。
  • 在使用git的过程中,我也感受到了现代版本管理系统的强大功能,通过在终端输入指令或者图形化界面,我们便可以轻松实现一个项目的不同版本间的转换。但我的现在的水平还仅限于使用git成功提交作业,希望在未来我能够进一步深入学习git相关知识。

四、对OOPre课程的简单建议

在听课过程中某些概念不好理解,比如“观察者模式”等,只听概念的话有一种云里雾里的感觉,希望以后多讲一些相关代码示例,从而提高学习效率。

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

270

社区成员

发帖
与我相关
我的任务
社区描述
2026年北航面向对象设计与构造
java 高校
社区管理员
  • 孙琦航
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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