270
社区成员
发帖
与我相关
我的任务
分享
面向对象编程(OOP)是一种程序设计思想,它将程序中的数据和操作数据的函数封装在一起,通过对象和类来组织代码。在这学期的OOPre课程中,我不仅学到了OOP的基本理论,还通过具体的作业实践加深了对面向对象的理解。本篇博客将总结我在递归下降法实现、JUnit测试和从面向过程编程到面向对象编程的转变过程中获得的体会,并提出我对本课程的几点建议。
最初的架构将所有的功能都放在了一个大的Adevnturer类中,导致代码耦合度过高,逻辑不清晰。随着功能的增加,这种设计逐渐暴露出问题,难以进行扩展和维护。
为了解决这个问题,我将程序分为多个模块,每个模块负责特定的功能。例如,Adventurer类专门负责冒险者的属性和行为,Item类用于管理物品,Relation类用于处理冒险者间的雇佣关系。通过这样的划分,每个类只处理自己的职责,程序结构更加清晰,易于扩展。
在实现递归下降法时,我最初将所有的逻辑都放在一个方法中,导致代码冗长且不易理解。后来,我将解析过程拆分为多个方法,每个方法负责解析特定的部分(例如,parseAdventurer()解析冒险者,parseRelation()解析关系)。这样的优化不仅使代码更简洁,还增加了可读性。
JUnit测试是确保程序正确性和稳定性的关键工具。在课程中,我通过编写JUnit测试用例来验证各个功能模块的正确性,这极大地提高了debug的效率与正确性。
在编写测试用例时,我特别关注了方法、行和分支的覆盖率。通过设计多个测试用例,确保了代码中的每个分支和路径都被充分测试,达到了较高的覆盖率。
JUnit测试帮助我在开发过程中及时发现了代码中的潜在问题。例如,在测试lr指令的解析时,我发现了对于嵌套括号的解析存在遗漏,经过修复后,测试用例通过了所有的验证。
通过JUnit测试,我不仅能够验证功能的正确性,还能帮助我发现潜在的边界问题。在编写测试用例时,我学会了如何设计合理的测试用例,并提高了代码的健壮性。
在课程开始之前,我大部分时间是用面向过程编程的思维来编写代码。面向对象编程给我带来了很大的挑战,但也带来了更高效的编程方式。特别是在设计复杂系统时,OOP让代码更加模块化和可扩展,全新的代码编写的思维方式也为我提供了一种全新的思考的方式。
面向对象编程的三大特性——封装、继承和多态,在本次作业中得到了充分应用:
尽管OOP提高了代码的可扩展性和可维护性,但在实际编码中,我也遇到了一些挑战,特别是在设计类的关系和确定继承结构时。为了避免过多的类之间的耦合,我需要在继承和组合之间找到平衡。
通过本课程,我不仅加深了对不同风格代码的理解,还在实际编码中体会到了面向对象编程的强大。OOP不仅使我的代码更加清晰和可维护,还让我在面对复杂的程序设计时更加得心应手。在今后的学习中,我将继续巩固OOP的知识,并应用到更多实际项目中。
Main.java:程序的入口点,包含主方法,负责程序的初始化和启动。
Lexer.java:负责词法分析,将输入的文本转换为可以被解析器处理的符号(token)。这是实现递归下降解析器的一部分。
LRParser.java:递归下降解析器,负责解析由Lexer生成的token,并构建关系树或图结构,处理复杂的指令。
Adventurer.java:表示一个冒险者,包含如生命值、攻击力、防御力等属性以及相关的方法。
Item.java、Bottle.java、AtkBottle.java、HpBottle.java、ManaBottle.java、DefBottle.java:这些类表示不同种类的物品,主要是瓶子类,可能与生命、魔法或攻击等效果相关。
Weapon.java、Sword.java、Armour.java:表示不同类型的装备,如武器和盔甲。
Battle.java:处理战斗逻辑,可能包括伤害计算、回合制逻辑等。
RelationManager.java:管理冒险者之间的关系(如雇佣关系或联盟关系),这是游戏系统中的重要组成部分,负责跟踪冒险者之间的互动。
AidCenter.java:负责管理治疗或帮助系统,提供给冒险者某些辅助功能。
Factory.java:这是一个设计模式实现(如工厂模式),用于创建像物品、装备或冒险者等对象。
MathUtil.java:包含一些数学工具类,用于战斗中的伤害计算或其他数值处理。
UseResult.java:包含使用物品或法术后的结果,如成功与否等信息。
RelationManager.java:管理冒险者之间的关系。
模块化设计:系统通过将不同的功能分配到不同的类中(如冒险者、物品、法术、装备、战斗逻辑等),遵循面向对象的原则,每个类负责一个单一的职责。
递归下降解析:使用Lexer和LRParser来解析lr指令,支持动态解析命令,比如用来加载冒险者之间的雇佣关系指令。递归下降解析器用于解析复杂的命令。
游戏逻辑与关系管理:RelationManager.java和战斗相关的类重点在于管理冒险者之间的复杂关系,尤其是雇佣关系。
Spell.java、Magicbook.java:管理冒险者可以学习和使用的法术,包括法术的效果、魔法消耗等。
封装:通过Adventurer、Item和Relation等类的封装,使得每个类都专注于自己的功能,避免了功能之间的耦合。
继承:通过继承,我可以在不同类型的物品(例如HpBottle、AtkBottle等)中共享通用的功能,同时为不同类型的物品扩展特定的功能。
多态:在处理不同类型的物品时,我使用了多态的特性,让代码更加简洁且具有扩展性。例如,通过多态处理不同类型的物品时,不需要修改现有代码,只需要添加新的物品类即可。