2025北航OOpre结课总结

黄诗韵-24373386 2025-11-13 18:04:33

​一、最终架构设计

 

1.程序执行的大致思路为:

Main读取原始指令→ 交由 Operator解析与协调→ 定位/创建Adventurer→ 将具体操作交给 Adventurer→ 执行后续处理(援助 / 死亡)→ 输出结果。

2.程序入口:Main

主逻辑简单,只用来循环读入指令,再交给Operator进行解析。

3.顶层控制:Operator

3.1 内含一个ArrayList<Adventruer> advs用来管理所有的冒险者。

3.2 由Operator来解析处理所有指令。

3.3 每当接收到一条操作指令时,Operator 会:

  1. 解析输入的参数
  2. 定位对应的冒险者
  3. 调用其方法或其他模块完成具体操作
  4. 在需要时输出信息

这使得每种操作(如 add adventurerfightuse 等)都可以独立实现。

4.核心类:Adventurer

4.1 管理自己的属性(idhitPointatkdef等)、物品items、所学法术spells及背包backpack,背包单独实现为一个类Backpack,让冒险者类不太臃肿。

4.2 实现了Operator中接受的所有指令的对应方法。

4.3 实现了EmployerEmployee接口,设置一个employer对象和一个ArrayList<Adventurer> employees,形成一个树状雇佣关系网络让每个冒险者单独管理自己的雇佣关系。使用观察者模式在冒险者间实现基于雇佣关系的通知和互动(攻击、救援等)。

5.物品类层次结构:

顶层父类:Item

定义了所有物品的基础属性和基本方法。

子类 1:Bottle

药水类(Bottle)用于改变冒险者的属性。

通过 type 字符串区分不同种类的药水(如 HpBottleAtkBottleDefBottleManaBottle)。 实现 Usable 接口,支持统一的 use() 操作逻辑。

子类 2:Equipment

装备类(Equipment)代表可提升战斗力的物品.

通过 type 字符串区分不同种类的药水( SwordArmourMagicbook等)。

6.法术类:Spell

6.1 含基本属性(idtypemanaCostpower等)。

6.2 用字符串type来区分不同法术(HealSpellAttackSpell等)。

6.3 实现 Usable 接口,支持统一的 use() 操作逻辑。

7.背包管理:Backpack

7.1 独立负责冒险者的物品携带与管理,包括添加、删除、查找等 ,从Adventurer类中分离。

7.2 设置ArrayList<Bottle> bottles和装备槽位(Weapon / Armour),限制了每名冒险者同时最多只能携带10瓶药水,装备一件武器和一件护甲。

8.针对lr指令的文法分析:

8.1 Token:

定义了词法单元(标识符、括号等),用于将原始字符串拆解成可识别的符号。

8.2 LrLexer:

负责将输入字符串分解为 Token 列表。

8.3 LrParser:

使用递归下降的方式解析由 LrLexer 生成的 Token , 逐层构建出冒险者之间的树形雇佣结构。 将Operator传入,解析结果直接作用于 Operator 中的雇佣关系更新逻辑。

二、迭代过程的架构调整:

在迭代过程中我并没有大的架构调整,只处理了一些细枝末节:

第三次作业:

1.继承关系调整:

最初的Bottle类下设多个子类(HpBottleAtkBottleDefBottleManaBottle),但是对于这些子类来说各自特别实现的功能过少,所以改为了用Bottle类中字符串type来区别的形式。

2.增加Item父类

2.1 提取BottleEquipment的公共属性和方法为Item,让BottleEquipment继承Item

2.2 将Operator中的BottleEquipment的ArrayList改为Item的ArrayList,实现多态管理。

3.增加Usable接口

让Bottle和Spell实现Usable接口。

第六次作业:

1.使用观察者模式

增加EmployerEmploee接口让Adventurer实现,使用观察者模式来进行Adventurer间的雇佣关系交互。

2.检查方法的单一职责原则

去除Adventurer类的useUsable()方法的功能,信息输出由Operator实现。

三、使用JUnit的心得体会

我过去写程序时一直没有关注自主测试的问题,都是提交有错误才会编一些测试点进行程序测试。JUnit的设置改变了我的习惯,让我了解到程序测试的重要性,编写JUnit的过程也很好的锻炼了我debug的能力。我觉得JUnit相对于传统测试的最大的优点就是它可以分单元测试,可以细化到每一个类、每一个方法的实现,很精准地定位bug,并且它的测试单元间有着极好的独立性,编写测试程序时只用关注一小块代码,大大提高了测试效率。同时它的自动化测试特性和在迭代过程中的可复用性也很值得肯定,我想这是一项必须掌握的技能。

四、学习OOPre的心得体会

过去一年我接触过C语言、C++和JAVA,C语言属于面向过程的语言,写的过程中很多操作的实现非常直接,而到了像C++和JAVA这类面向对象的语言时,许多原本很简单的操作却要多出许多预备动作,这一开始让我很反感。不过,在作业迭代的过程中我逐渐发现了面向对象特性的巨大优点——可读性、可维护性、可复用性高。

因为有一点C++的基础,在这几次迭代作业中我严格遵守面向对象的原则,大部分作业只用了几个小时,但听说我身边的有些同学用了好几天,这让我瞬间意识到了程序架构的重要性,意识到了面向对象这个特性在大型的代码工程中的巨大优势。”快就是慢,慢就是快“,或许就是这个道理,虽然在最初建立基础架构的过程中会觉得很多操作很多余,但是越迭代到后面却越觉得得心应手,不得不说面向对象特性带来的便利超乎了我的想象。

五、对OOPre课程的简单建议

希望老师每节课前提前把课件发到群里。

...全文
79 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
串联谐振双有源桥(SR-DAB)DC-DC变换器闭环仿真研究内容概要:本文围绕串联谐振双有源桥(SR-DAB)DC-DC变换器的闭环仿真展开研究,重点探讨其在电力电子系统中的动态响应特性与控制策略。通过对SR-DAB变换器建立数学模型,并结合Matlab/Simulink进行闭环仿真,分析系统在不同工作条件下的电压、电流波形及功率传输效率,验证控制算法的有效性与稳定性。研究涵盖系统建模、控制器设计(如PI控制)、软开关实现条件、抗干扰能力以及动态调节性能,旨在提升变换器在新能源、储能、数据中心供电等场景中的可靠性和能效水平。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、微电网、电力系统仿真等相关领域的科研人员与工程技术人员。; 使用场景及目标:①用于高校及科研机构开展DC-DC变换器控制策略的教学与实验;②为工业界在高效率隔离型功率变换系统的设计与优化提供仿真依据和技术支撑;③服务于数据中心、电动汽车、可再生能源并网等场景下的电源系统研发。; 阅读建议:建议读者结合Matlab代码实践仿真流程,重点关注系统建模与控制器参数整定部分,通过调整负载、输入电压等条件观察系统响应,深入理解闭环控制对变换器性能的影响机制。
内容概要:本文介绍了FastReport VCL/FMX/LCL 2026.2.4版本的更新内容,重点涵盖核心引擎、图形处理、用户界面及导出功能的优化与修复。主要更新包括修复了Developer Express兼容性问题、TfrxSVGGraphic在TImage中的显示问题、PDF/A导出合规性、EMF图像旋转异常,以及ReportTree拖拽功能等问题。同时,部分模块新增了HTMLTags对XLSX导出的支持、内置右键菜单和新图标,并改进了FastCube组件的元素调整体验。此外,还修复了CPP脚本中Result参数名的Bug以及自定义过滤器中OR操作失效的问题。; 适合人群:使用Delphi或Lazarus进行开发,且涉及报表设计与数据展示功能的中高级开发者;尤其适用于需要集成FastReport控件到企业级应用中的技术人员。; 使用场景及目标:①提升报表系统在不同平台(VCL/FMX/LCL)下的稳定性和兼容性;②满足PDF/A标准的文档归档需求;③优化用户交互体验,如拖拽操作与元素缩放;④增强脚本支持与数据集字段识别能力,确保开发效率与功能完整性。; 阅读建议:建议结合官方更新链接和实际项目中使用的FastReport模块对照查看,重点关注自身所用组件(如VCL、FMX或Lazarus版)的具体修复项,及时升级以规避已知问题并利用新特性优化报表功能。

309

社区成员

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

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