2025 BUAA OOPre课程总结

于嘉奇-24373465 2025-11-15 19:11:25

Chap 1 作业架构设计

一、代码架构

1.实现类

img

1.1 Adventurer

功能:

  1. 定义冒险者的基本属性并初始化;
  2. 实现针对冒险者个人的相关方法,大幅降低代码耦合程度。

属性:

  1. 参数:advId,hitPoint,atk,def,mana,money
  2. 管理对象:items,usables,bag,employees。其中,items表示拥有的物品,usables表示拥有的可在use操作中使用的物品或技能,bag表示携带的物品,employees表示自己所有的下级

重要方法:

  1. 物品管理:addBottle();addEquipment();learnSpell();removeItem();takeItem();
  2. 动作技能:use()//作为发起者时;changeAttribute()//作为目标时;fight()//作为目标时;acquireMoney();buyItem();
  3. 关系管理:notifyEmployees();aidEmployer()//援助系统;addRelation();removeRelation();

1.2 Equipment

属性:

参数:equId,ce;

下设多个子类,具体关系见上方图表。

1.3 Bottle

属性:

参数:effect,botId;

下设多个子类,具体关系见上方图表。

1.4 Spell

属性:

参数:speId,manaCost,power;

下设多个子类,具体关系见上方图表。

1.5 Bag

功能:

  1. 实现单个冒险者所携带物品的管理和相关方法。

属性:

  1. 参数:bottlesNum;
  2. 管理对象:bottleBags,weapon,armour;

重要方法:

  1. 查找物品:findBags();findBagBottles(),hasBeenTaken()//判断是否已经被携带,hasBeenTakenBottle();
  2. 删除物品:removeBag();
  3. 添加物品:addBags();

1.6 Factory

功能:

  1. 统一创建物品,实现创建的系统化。

重要方法:

createBottle(),createSpell(),createEquipment(),createItem();

1.7 Lexer

功能:

  1. 语法检查

属性:

  1. 参数:input,pos//记录当前处理位置,curToken;

重要方法:

getID(),next(),peek();

1.8 AdventurerNode

功能:

  1. 实现loadRelation()方法中的root节点创建,把正则表达式形式的关系转化为链表形式,供Execution类进一步处理。

属性:

  1. 参数:advId;
  2. 管理对象:ArrayList<AdventurerNode> relationTree;

重要方法:

loadRelation(String s),parserAdventurer(Lexer lexer);

1.9 Execution

功能:

  1. 实现程序的直接功能实现,在main文件中调用execution()即可实现功能。
  2. 定义全局化的冒险者管理+功能实现方法。

属性:

参数:adventurers();

重要方法:

  1. 执行程序:execution(int n, ArrayList<ArrayList<String>> inputInfo);
  2. 冒险者及关系管理:addAdventure(),addRelation(),loadRelation(),removeRelation()
  3. 物品/技能管理:addBottle(),addEquipment(),learnSpell()removeItem(),takeItem()buyItem();
  4. 动作技能:use(),fight();

2.实现接口

img

2.1 Employer

重要方法:

notifyEmployees()//通知下级,addHitPoint();

2.2 Employee

重要方法:

aidEmployer()//帮助上级;

2.3 Item

功能:

  1. 统一管理可以被takeItem(),removeItem()方法影响的对象。

2.4 Usable

功能:

  1. 统一管理可以被use()方法影响的对象。

3.迭代中的架构调整及考虑

  1. 项目在第五次作业时,对Item进行了从继承关系到接口关系的重构。这里主要考虑到接口关系更利于扩展,维护更方便,并且与Usable保持了一致。
  2. 项目在第七次作业时,对addRelation(),removeRelation()等方法进行了方法重写,使方法可读性更强。

二、使用JUnit的心得体会

  1. 在代码初次提交之前可提前找到bug,并且可以较为便捷地找到bug所在位置。
  2. 对测试文件覆盖率的硬性要求有效降低了隐形bug存在的可能性
  3. 写测试文件的同时,也是对项目本身逻辑的梳理,可以加深对项目的逻辑认知。

三、学习OOPre的心得体会

学习OOPre的核心是思维从“步骤化”转向“模块化”。面向过程需逐句拆解流程,耦合度高且难维护;面向对象通过封装、继承、多态将功能抽象为类,代码复用性与扩展性大幅提升。这种转变让我学会从“解决问题”到“设计实体”,编程更具逻辑性与可维护性,也更贴合复杂系统开发需求。

四、对OOPre课程的简单建议

  1. 进一步加强课上和课下作业的联系程度。
  2. 提升OOPre平台强测debug功能的鲁棒性。
...全文
27 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

271

社区成员

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

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