2025 oopre 总结

李浩铜-24373431 2025-11-15 20:50:45

架构设计

 

  • 探险者类:由Adventurer(个人)、Adventurers(所有探险者集合)、AdventurerState(状态类)组成。最开始想把AdventurerState类设计成一个Bean,后来还是算了。
  • 物品类:顶层基类Item,实现了Takeable接口的TakeableItem,共同派生出Spell、Bottle、Equipment三大类物品。这里体现了面向对象编程的“类”的思想,即封装、继承、多态。物品类采取工厂模式实现。
  • 命令类:由一些列Command类和Commands类、CommandArg类构成,同样,从Command类派生出各种具体的命令实现类,而CommandArg类作为封装参数的Bean。命令类采取变种单例模式实现。
  • 异常类:为了方便管理异常并判定特殊情况,我建立了一系列异常类派生自RuntimeException,同时,在主类中处理如AdventurerDeadException等异常,可以简化死亡检测。
  • 日志类:在“冒险者援助”部分中,我意识到这不是简单的运行结果的输出,而是按照一定规则输出程序的日志。因此,我使用单例模式构建了Logger类,用于记录援助日志。
  • 表达式类:在最后一次迭代中,需要使用递归下降法来分析表达式。

迭代中的架构调整:

  1. 最开始采用了扁平化的方法,不分包
  2. 后来开始分包,并加入各种抽象基类和接口
  3. 随着业务复杂,开始引入一系列命令类和异常类
  4. 需要日志输出时,引入日志类
  5. 最终,引入表达式类

使用 Junit 的心得体会

Junit 4 是一个广泛使用的单元测试框架,在当前的简易项目中,利弊并不明显,但是如果项目更加复杂,使用TDD(测试驱动设计)可能是更高效的开发方法。Junit使用简易,但是在覆盖率计算方面,可能存在算法不一致等情况。同时,合理利用其高级特性也很重要,比如测试前的@SetUp方法,可以为每个Case快速初始化出相同的环境。

学习OOPre的心得体会

从前我写项目都是自己提需求、自己设计、自己完成,整个思维链非常清晰,但是在OOPre的迭代作业中,我第一次体验到了做一个合格的乙方,不仅需要强硬的技术能力,更要有好的迭代开发习惯——比如总是写出易于重构的代码而非过度设计,解耦合,维持开闭原则等,才能在第一时间get到“产品经理”的需求,从而快速高效敏捷地完成开发。

对OOPre课程的简单建议

  1. 建议在迭代开始前,先把整个项目描述好(这里可以是“冒险者游戏”的世界观,可以是它的目的、最终实现效果等),让同学们(尤其是有基础的同学)在最开始能够有效get到项目需求,从而从从容容、游刃有余。即使是简单的一句“支持不同类型、不同效果的物品携带与使用”,就能让同学们提前设计好合理的接口与继承框架,而非“每次迭代都在重构”。同样的问题出在“冒险者援助”环节,这里一个命令可能输出很多行,并且有着严格的顺序要求。如果在业务代码中直接使用System.out.println函数,则势必出现无法使用Junit测试的情况,违反了项目使用Junit进行充分单元测试的规则。这个问题本质上是产品需求模糊造成的,我认为应该提前明确我们的项目是“输入-处理-日志”的像貔貅一样的游戏模型,而非“输入-处理-输出”的普通脚本模型。而且在最初设计阶段,是有必要明确“我们的项目到底是什么,什么样”这一问题。
  2. 建议引导学生完成从脚本(程设)到项目(OO)的思维转换,面向对象不只是简单的树状的继承图,更是一套设计思维、开发方式。当前,课程设计中已经融入了工厂模式、单例模式、观察者模式,但是较少涉及到项目管理(如Java的分包),以及对业务数据类与业务逻辑类分开(Entity),分层架构(典型如Service / Repository / Controller),TDD(测试驱动设计)等的简单介绍,这使得同学们仍然在以脚本的逻辑来处理面向对象的编程项目,而难以体会到项目编程与脚本编程的区别,难以领略到项目编程的风采。
...全文
21 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

270

社区成员

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

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