OOPre 课程总结

徐浩然-24371357 2025-11-06 13:52:52

一. 作业的最终架构

img

该项目是一个基于冒险角色(Adventurer)的角色扮演类程序,包含角色属性管理、物品装备、技能使用、战斗系统及关系管理等核心功能,整体架构围绕冒险角色的行为和交互展开,主要可分为以下几个模块:

1. 核心角色模块(Adventurer)

  • 核心类Adventurer
  • 功能:作为整个系统的核心,管理角色的基础属性(生命值、攻击力、防御力、魔法值、金钱)、物品/技能持有、战斗行为、人际关系(上下级/盟友)等。
  • 关键逻辑
    • 属性操作:提供生命值、攻击力、魔法值等属性的增减方法。
    • 物品/技能管理:通过HashMap存储物品(Item)和技能(Spell),支持添加、移除、使用等操作。
    • 战斗与交互:包含fight方法发起战斗,useItem方法使用物品/技能,assist方法处理盟友援助逻辑。
    • 关系管理:通过parentsons维护上下级关系,提供isBossof(判断是否为上级)、isAlly(判断是否为盟友)等方法。

2. 物品与装备模块

  • 核心接口/类Item(基类)、Equipment(装备子类)、Bottle(消耗品子类)、Usable(可使用接口)。
  • 功能:定义各类物品的属性和使用逻辑,分为装备和消耗品两大类。
    • 装备(Equipment)
      • 子类:Armour(盔甲,增加防御力)、Weapon(武器,增加攻击力),Weapon又派生Sword(剑)、Magicbook(魔法书,特殊攻击逻辑)。
      • 核心逻辑:通过setBrought方法在装备/卸下时修改角色属性(攻击/防御)。
    • 消耗品(Bottle)
      • 子类:HpBottle(生命瓶)、AtkBottle(攻击瓶)、DefBottle(防御瓶)、ManaBottle(魔法瓶),均实现Usable接口。
      • 核心逻辑:use方法定义使用效果(如恢复生命、增加属性),需满足“仅对盟友使用”和“已携带”条件。

3. 技能模块(Spell)

  • 核心接口/类Spell(基类,实现Usable接口)、AttackSpell(攻击技能)、HealSpell(治疗技能)。
  • 功能:技能需消耗魔法值,分为攻击和治疗两类。
    • 攻击技能(AttackSpell):对非上级目标造成伤害,需检查使用者魔法值是否充足。
    • 治疗技能(HealSpell):对盟友恢复生命值,需检查使用者魔法值是否充足。
  • 关键逻辑useable方法判断技能是否可使用(魔法值是否足够),use方法执行技能效果。

4. 容器模块(Bag)

  • 核心类Bag
  • 功能:管理角色携带的物品,包括消耗品(Bottle)、装备(ArmourWeapon)的存储和容量限制。
  • 关键逻辑
    • 消耗品容器:使用双端队列(Deque)存储,容量限制为10个,超出时移除最早携带的物品。
    • 装备容器:同一时间只能装备一件盔甲和一件武器,切换装备时自动卸下当前装备。
    • 战斗支持:通过attack方法调用当前装备武器的攻击逻辑。

5. 工厂模块(Factory)

  • 核心类Factory
  • 功能:提供各类物品、装备、技能的创建方法,根据类型(如“HpBottle”“Sword”“HealSpell”)实例化对应子类对象,降低模块间耦合。

6. 输入解析与命令处理模块

  • 核心类MainClassLexer
  • 功能:处理用户输入命令,解析并执行对应的游戏操作。
    • MainClass:通过main方法接收输入命令(如“aa”创建角色、“ae”添加装备、“use”使用物品、“fight”发起战斗等),调用对应逻辑处理。
    • Lexer:解析复杂命令(如“lr”定义角色关系),处理括号和标识符,辅助构建角色间的层级关系。

      整体架构关系

  • 核心角色(Adventurer)依赖物品(Item)、技能(Spell)、容器(Bag)实现属性管理和交互。
  • 物品和技能通过Usable接口统一使用逻辑,工厂类(Factory)负责对象创建,降低模块间依赖。
  • 命令处理模块(MainClass)作为入口,解析用户输入并调用核心角色的方法,驱动整个系统运行。

该架构通过类的继承(如Weapon继承Equipment)、接口实现(如Spell实现Useable)和工厂模式,实现了功能的模块化和扩展性。

二. JUnit的使用心得体会

  • Junit 的使用让测试代码变得更加容易,可以理解为内置在程序内,可以一键运行的样例。其可以覆盖到代码的最小运行单元,从而一步步覆盖更为复杂的功能。
  • 编写 Junit 测试代码的同时也是对代码的再次检查。写测试用例时,会逼着自己想 “输入什么、该返回什么”,比如正常参数、空值、边界值这些情况。这一步能提前找出代码漏洞,减少对着完整项目进行调试的麻烦。
  • 项目改旧代码、加新功能时,只要之前写了 JUnit 测试,改完后跑一遍用例,就能验证迭代的内容是否会对原代码产生影响。

    三. OOPre的学习心得体会

  • 从 “按步骤做事” 到 “先搭架子再填内容”:以前用面向过程编程,想的是 “要完成这件事,第一步做什么、第二步做什么”,代码是按流程一步步写的,函数之间互相调用,数据和逻辑混在一起。学了 OOPre 后,先想 “这件事里有哪些核心对象”,比如 “学生”“成绩表”,再给每个对象定义 “属性”(比如学生有姓名、学号,成绩表有各科分数)和 “行为”(学生能查成绩,成绩表能算平均分)。相当于先搭好 “积木块”,再用积木拼出完整功能,逻辑更加清晰。
  • 代码逻辑清晰、复用性高
    封装:把对象的属性和行为打包在一起,比如 “物品” 对象的名称等属性。只在内部修改,外部不用关心细节,减少代码冲突。
    继承:比如要实现 “攻击药水”、“防御药水” ,可以先写一个 “药水类”,包含共同的属性(效果)和行为(携带,丢弃,使用),子类只要加自己的特殊功能(攻击力,防御力,生命,法力),不用重复写父类代码或只需改写一部分方法。
    多态:同一个行为(使用),药水和武器的实现方式不同,只需让不同对象用自己的方式实现,不用写多个判断逻辑,代码更简洁。
  • 代码更易维护:面向过程的代码,流程环环相扣,只要改一个步骤,可能会影响后面一串函数,排查起来特别麻烦。OO 里每个对象都是独立的 “模块”,数据和逻辑被封装在内部,修改一个对象的功能,只要不改变它对外的 “接口”,其他模块完全不受影响,维护成本大大降低。

OO 的核心就是 “以对象为中心”,把复杂问题拆分成一个个独立的小模块,让代码更易理解、易复用、易维护。它不只是一种编程技巧,更是一种 “化繁为简” 的解决问题的思维方式。

四. 对OOPre课程的简单建议

  • git工具的使用希望能有更系统性的讲解
  • 课上部分设计内容讲解较快,或许可以通过一些例题提供思考的时间
...全文
60 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

270

社区成员

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

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