270
社区成员
发帖
与我相关
我的任务
分享
CmdProcessor 指令实例化与分发(类似于指令工厂)
Command 指令类
Adv 冒险家,是游戏中心类,绝大多数指令解析时的主体(除了最后一次迭代)(备注:雇主、雇员接口)
Bottle (备注:消耗品)
Equip (备注:武器、护甲、魔法书)
Spell
Stats 冒险家属性管理(hp、attack、def、power、money)
ItemType 枚举类型(包括所有有类型的东西的类型)
Constance 全局常量
FightField 战场
Store 商店系统
WorldLibrary 关系/互动记录(战前存档、友军判断)
GraphMaker 雇佣关系图构建器
Lexer 语法分析器
因为第一次面向对象编程,感觉搭这个冒险家游戏,什么战斗、买东西之类的都好说,让我花最多时间、重构次数最多的,是输入处理的逻辑。反反复复写了好多次,从最开始的 随用随输入(就很离谱),到把输入处理都堆在 Main class 里(被 JUnit hack 了),再到在 AI 建议下造指令工厂,专门弄了一个 Cmd class,还是有点丑,但也够用了。
Command class,把 指令 视作可实例化的对象,指令的属性:
private final String op; // 指令的类型
private final String advId; // 发现每一条指令都有冒险者 id
private final String[] args;
输入解析(把一行输入整理成我的Command类), CommandProcessorClass核心的指令处理器,传入整理成 Command 类型的指令数组,相应指令。冒险家名单自然也是在这里。
Consumer 函数式接口观察发现,每个方法都需要
设计 withAdv 方法来处理公共部分:
private void withAdv(String id, Consumer<Adv> action) {
Adv adv = getAdv(id);
if (adv != null) {
action.accept(adv);
}
}
Consumer 把一段代码当参数传递,在需要的时候执行, 描述 “找到冒险家之后该对他做什么”,把里面的方法 accept(Adv adv) 作为参数传给 addBottle。把变化的操作逻辑从固定的查找逻辑中分离出来,从而实现重复逻辑的合并。
CmdProccessor 中 adv 设成了静态的,给测试造成了很大麻烦,因为它们互相影响。CmdProcessor.getAdvs().clear();
非常有趣且令人愉快的课程,虽然我猜下学期就是有趣但不愉快了。
建议: