2025-OOpre-课程总结

季鼎凯-24371376 2025-11-06 16:18:33

1.最终架构设计

下面是idea自动生成的架构图,还不够完善

img

下面结合个人理解对整个项目再次详细阐述框架

核心类:

main:主程序,实现对指令的读取、分割、识别以及对应地向 AdventureManager类调用相关的指令实现方法。

Adventurer类:即冒险者类,保存了冒险者的所有属性,物品法术等列表,以及核心的相关方法

AdventureManager类:即冒险者管理类,存有目前以及注册的冒险者列表,以及指令实现的核心方法,向Adventurer类调用关键方法。

HireSystem类:雇佣关系的管理系统,内有新增或删除雇佣关系等关键方法。

RelationshipManager类:冒险者关系管理系统,经由雇佣关系的处理后,对每个冒险者的上级与盟友关系进行生成或修改等处理。

实例&抽象类:

Bottle 类:抽象类,表示药水瓶,其下拥有实例:AtkBottle(伤害增幅药水)、DefBottle(防御类药水)、HpBottle(Hp药水)、ManaBottle(魔法值药水)。具体的药水功能由相对应的具体实例药水类实现。

Equipment类:抽象类,表示装备,其下拥有Armour类和Weapon类。其中Armour类是实例类,表示装甲;Weapon类是抽象类,其下有MagicbookSword两种武器实例。

Spell类:抽象类,表示咒语,其下拥有实例:AttackSpell(攻击法术)、Healspell(治疗法术)。具体的法术效果实现由相对应的具体实例法术实现。

接口类:

Item:表示可携带的物品,囊括装备和药水。

Usable:表示可使用的“东西”,包括法术和药水,及其使用的效果实现方法

其它:

LexerLrParser:文本解析器,用于处理lr指令。

Factory:工厂,实现购买系统中商品的生成。

2.项目迭代思路:

第一次作业:

尝试使用并熟悉git的相关基本操作,一开始完全不会,克隆仓库也困难重重,在与同学和助教的探讨中逐渐有些了解,现已比较熟练地掌握基础的git操作。

第二次作业:

冒险者项目的基础原型,了解了“容器”这一概念,并学会使用了ArrayList这一可动态修改的数组。同时,逐步尝试构建一些简单的方法。

第三次作业:

学习了子类与父类的继承关系,并学习了如何使用这些子类与父类的构建与使用,例如:添加Bottle作为父类,其具体的一些药水例如ManaBottle作为子类,子类继承父类的属性,并在子类中完成对父类的方法重写,从而达到具体的不同类型药水的效果实现。此外,学习了接口这一概念,并尝试在作业中使用接口统一管理一些“一类的”项目类,比如可装备物品,可用的东西.....

第四次作业:

不涉及冒险者项目的迭代,主要学习内存、克隆、迭代器遍历以及如何在idea中debug等内容,并在作业中对于学习了解的常见相关bug做了debug。

第五次作业:

学习了另外两种容器HashMapHashSet,工厂模式(在项目中具体体现在利用工厂模式来创建购买得到的商品)。在实现项目迭代中,一开始对冒险者的基础属性和装备属性混淆,对于装备对冒险者的属性加成理解为修改冒险者的基础属性,在装备上时增幅,在卸下装备时消除增幅,理论上这种方法没错,但是会导致在冒险者装备着武器或装甲时无法得到冒险者的基础属性,只能得到基础属性加上装备属性,导致之前实现的use等指令的返回值错误,发现后重新理解要求后成功debug。

第六次作业:

学习了解了观察者模式等相关概念,并实现了冒险者之间雇佣关系、上下级关系以及盟友关系的构建。构建时,原本打算照例在Adventurer类中实现核心的方法,但由于Adventurer类已经有些臃肿,若再次添加会过于臃肿,遂只在Adventurer类中增加一些简单的属性返回等基本的相关方法。此外,在此次作业的debug中发现之前遗留下来的问题:在使用法术时,对于使用者的法力是否充足这一判断逻辑出错,导致冒险者明明没法使用法术,虽然并未正真使用,但是没有输出应该输出的相应的报错信息。还有就是,对于指导书中的“若该指令不涉及冒险者死亡的情况,即使该指令由于一些其他原因失败或属性变化值为 0,我们也称 A 对 B 造成了不利影响(有利影响)”这句话一开始没解读正确,导致先判断有些法术或药水是否能够成功使用,本应该先判断是否违反了冒险者之间关系的约束,修改后debug正确。

第七次作业:

学习了文法、语法以及语法分析器等内容,并具体地在项目中实现lr指令,即批量导入冒险者之间的雇佣关系。一开始不太好理解,深入思考后理解了相关的概念和逻辑,在项目中迭代实现没有遇到很大的困难,只是在处理空格时出错,导致指令内容有些错误拼接,后续修改后正确。

3.使用JUnit的心得体会:

在本课程的学习过程中,算是第一次较为系统地接触到了单元测试工具 JUnit。以往在编程时,往往只依靠手动输入输出进行验证,这种方式说实话既低效又容易遗漏问题。而在使用 JUnit 后,我逐渐体会到测试驱动开发的优势。通过为每个方法编写对应的测试用例,我能够更清楚地了解程序的输入输出关系,也能在修改代码时快速判断是否引入了新的错误,虽然一开始完全不会写,但是摸爬滚打还是可以慢慢学会一点的。

在实践中,我学习了断言(assert)语句的使用,例如 assertEqualsassertTrue 等,这让我能够判断代码逻辑是否符合预期。同时,JUnit 的自动化测试机制让我意识到,良好的测试结构可以帮助项目在不断迭代中保持稳定性,尤其是在冒险者项目中多次修改类结构和方法逻辑的过程中,JUnit 测试极大地减少了重复验证的负担。

4.学习OOpre的心得体会:

在学习 OOPre 课程之前,大一主要使用的是 C 语言和少量的Python,思维方式仍然停留在面向过程的阶段。这类面向过程的编程主要关注“怎么一步步实现功能”,而不是去思考“如何让代码结构更合理”。转向 Java 后,课程中出现了“对象”的概念,引导我们开始习惯从“抽象”与“关系”的角度看待问题,而不只是从“流程”出发。

在项目实践设计中,面向对象思想的核心在于“封装、继承、多态”。例如,通过设计抽象类 Bottle 和具体子类 HpBottleAtkBottle,关于了抽象的意义——它让相似的功能能够通过统一的接口表达出来,同时又保留了各自的差异。这种结构的设计让代码更具扩展性,也更符合现实中对象之间的逻辑关系。继承与接口的使用也让我认识到程序设计不仅仅是“写代码”,更重要的是实现“设计结构”。一个清晰的类层次关系往往能让后续的迭代更加自然。

从 C 到 Java 的转变,不只是语法上的变化,更是思维方式的改变。在面向对象编程中,需要我们不再单纯地关注函数和变量,而是学会从整体系统角度思考每个类、每个方法的职责和关系。这种思维方式也让我在阅读他人代码时更加高效,能更快理解程序的设计意图。

5.对OOPre课程的简单建议

  • 可以考虑将每次的新迭代任务分成小块的相关的小题目,然后再由同学们自己去整合并根据题目要求完成任务,防止同学们看完指导书一头雾水不知该如何向下手。
...全文
41 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

270

社区成员

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

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