2025-BUAA-OOPre学习心得

整体架构

UML类图

alt text

Main类

接收控制台读入,并对读入的字符串进行解析,获取对应的指令并执行指令。

1
2
3
CommandFactory factory = new CommandFactory();
Command cmd = factory.parse(strings);
cmd.execute(strings);

迭代调整

分离思想

每个class功能应遵守单一职责原则,故当迭代中发现某个类功能过于繁杂、修改一动而牵全身时,应进行分离处理。

  1. 在发现Adventurer类变得过于繁杂之后,分离了其中处理Portable(可携带品)的功能:
    1
    2
    //Adventurer class
    private final Inventory inventory;
    在Inventory内部实现涉及到Portable的操作。 alt text

命令模式

迭代过程中不断需要添加指令。初始设计为在Main类中用case结构执行对应指令,但很快发现:

  1. Main类中方法过长
  2. 添加指令不方便

因此引入Command Pattern设计模式,优化指令可拓展性并简化Main类

单例模式

对Adventurer实例的管理:采取单例模式,创建World类,保证所有操作都是在同一个World实例里执行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class World {

private static Map<String, Adventurer> adventurerMap = new HashMap<>();
private static final World world = new World(adventurerMap);

private World(Map<String, Adventurer> adventurerMap) {
World.adventurerMap = adventurerMap;
}

public static World getInstance() {
return world;
}

public Map<String, Adventurer> getAdventurerMap() {
return adventurerMap;
}
}

工厂模式

将创建各种Usable的方法集成于CreateFactory类中。alt text

容器选择

几乎所有操作的都涉及到idobject的对应关系(key-value),故基本都采用HashMap来管理对象。 但,一旦涉及到顺序性,就必须更换容器,例如:

  1. fight指令涉及到战斗对象的先后顺序,故使用ArrayList来储存
  2. 携带物品的操作涉及FIFO,故在Inventory中采用:
    1
    private final Map<String, LinkedList<Portable>> bag;
    来记录携带信息

使用JUnit的心得体会

  1. 如果一个类很难被测试,通常意味着它的设计存在问题(例如职责不清、耦合度过高),进而推动我们修改代码。

学习OOPre的心得体会

  1. 什么才是一份好的代码?
    • 易于维护、扩展和复用
      • 尝试使用设计模式
      • 遵守设计原则:单一职责、开闭……
  2. 面向过程到面向对象的思维转变
    • 思考应设计什么对象、对象应具备什么属性和行为、对象之间如何协作

对OOPre课程的简单建议

  1. 迭代作业每次要切换仓库,导致版本管理流程(如commit、push等)较为繁琐,建议统一使用同一个仓库来进行迭代开发。

Copyright © 2026 CRZ's Blog

Powered by Hexo • Theme Candelas