309
社区成员
发帖
与我相关
我的任务
分享
Main读取原始指令→ 交由 Operator解析与协调→ 定位/创建Adventurer→ 将具体操作交给 Adventurer→ 执行后续处理(援助 / 死亡)→ 输出结果。
主逻辑简单,只用来循环读入指令,再交给Operator进行解析。
3.1 内含一个ArrayList<Adventruer> advs用来管理所有的冒险者。
3.2 由Operator来解析处理所有指令。
3.3 每当接收到一条操作指令时,Operator 会:
这使得每种操作(如 add adventurer、fight、use 等)都可以独立实现。
4.1 管理自己的属性(id、hitPoint、atk、def等)、物品items、所学法术spells及背包backpack,背包单独实现为一个类Backpack,让冒险者类不太臃肿。
4.2 实现了Operator中接受的所有指令的对应方法。
4.3 实现了Employer和Employee接口,设置一个employer对象和一个ArrayList<Adventurer> employees,形成一个树状雇佣关系网络让每个冒险者单独管理自己的雇佣关系。使用观察者模式在冒险者间实现基于雇佣关系的通知和互动(攻击、救援等)。
顶层父类:Item
定义了所有物品的基础属性和基本方法。
子类 1:Bottle
药水类(Bottle)用于改变冒险者的属性。
通过 type 字符串区分不同种类的药水(如 HpBottle、AtkBottle、DefBottle、ManaBottle)。 实现 Usable 接口,支持统一的 use() 操作逻辑。
子类 2:Equipment
装备类(Equipment)代表可提升战斗力的物品.
通过 type 字符串区分不同种类的药水( Sword、Armour、Magicbook等)。
6.1 含基本属性(id、type、manaCost、power等)。
6.2 用字符串type来区分不同法术(HealSpell、AttackSpell等)。
6.3 实现 Usable 接口,支持统一的 use() 操作逻辑。
7.1 独立负责冒险者的物品携带与管理,包括添加、删除、查找等 ,从Adventurer类中分离。
7.2 设置ArrayList<Bottle> bottles和装备槽位(Weapon / Armour),限制了每名冒险者同时最多只能携带10瓶药水,装备一件武器和一件护甲。
8.1 Token:
定义了词法单元(标识符、括号等),用于将原始字符串拆解成可识别的符号。
8.2 LrLexer:
负责将输入字符串分解为 Token 列表。
8.3 LrParser:
使用递归下降的方式解析由 LrLexer 生成的 Token , 逐层构建出冒险者之间的树形雇佣结构。 将Operator传入,解析结果直接作用于 Operator 中的雇佣关系更新逻辑。
在迭代过程中我并没有大的架构调整,只处理了一些细枝末节:
1.继承关系调整:
最初的Bottle类下设多个子类(HpBottle、AtkBottle、DefBottle、ManaBottle),但是对于这些子类来说各自特别实现的功能过少,所以改为了用Bottle类中字符串type来区别的形式。
2.增加Item父类
2.1 提取Bottle和Equipment的公共属性和方法为Item,让Bottle和Equipment继承Item。
2.2 将Operator中的Bottle和Equipment的ArrayList改为Item的ArrayList,实现多态管理。
3.增加Usable接口
让Bottle和Spell实现Usable接口。
1.使用观察者模式
增加Employer和Emploee接口让Adventurer实现,使用观察者模式来进行Adventurer间的雇佣关系交互。
2.检查方法的单一职责原则
去除Adventurer类的useUsable()方法的功能,信息输出由Operator实现。
我过去写程序时一直没有关注自主测试的问题,都是提交有错误才会编一些测试点进行程序测试。JUnit的设置改变了我的习惯,让我了解到程序测试的重要性,编写JUnit的过程也很好的锻炼了我debug的能力。我觉得JUnit相对于传统测试的最大的优点就是它可以分单元测试,可以细化到每一个类、每一个方法的实现,很精准地定位bug,并且它的测试单元间有着极好的独立性,编写测试程序时只用关注一小块代码,大大提高了测试效率。同时它的自动化测试特性和在迭代过程中的可复用性也很值得肯定,我想这是一项必须掌握的技能。
过去一年我接触过C语言、C++和JAVA,C语言属于面向过程的语言,写的过程中很多操作的实现非常直接,而到了像C++和JAVA这类面向对象的语言时,许多原本很简单的操作却要多出许多预备动作,这一开始让我很反感。不过,在作业迭代的过程中我逐渐发现了面向对象特性的巨大优点——可读性、可维护性、可复用性高。
因为有一点C++的基础,在这几次迭代作业中我严格遵守面向对象的原则,大部分作业只用了几个小时,但听说我身边的有些同学用了好几天,这让我瞬间意识到了程序架构的重要性,意识到了面向对象这个特性在大型的代码工程中的巨大优势。”快就是慢,慢就是快“,或许就是这个道理,虽然在最初建立基础架构的过程中会觉得很多操作很多余,但是越迭代到后面却越觉得得心应手,不得不说面向对象特性带来的便利超乎了我的想象。
希望老师每节课前提前把课件发到群里。