2023面向对象程序先导总结
1. 作业最终的架构设计, 在迭代中的架构调整及考虑
本次作业经过五次迭代最终实现了关于冒险者收集各种道具,使用各种装备,招募其他冒险者加入队伍,提升自己的等级并体验各种战斗以及购买和卖出价值体等操作。
迭代中的架构调整及考虑
-
这是迭代开发的第一次架构。 我建立了
Main
、Adventurer
、Bottle
、Equipment
类,利用容器管理所有冒险者,并管理每一个冒险者所拥有的药水瓶和装备。但在第一次架构中,由于经验不足,将输入输出等大量代码放在Main
类中,并且在main
方法中代码长度接近60行,导致可维护性、可读性较差。 -
这是迭代开发的第二次架构。 新增背包的概念以及
Food
类,我在新增功能实现代码的同时,调整了代码架构,Main
类中负责输入处理分析以及指令调用,具体的操作在其他类中实现,减少了Main
类的代码长度,提高了可读性和可维护性。 -
这是迭代开发的第三次架构。 引入战斗模式与战斗日志(
FightLog
)的概念,利用正则表达式等内容进行日志读入。但在这里又犯了hw2
中犯的错误,将新增的有关大量的代码放在Main
类中,造成Main
类代码冗长,并且降低了可读性和维护性(当时如此设计是认为adventurers
置于Main
类中,为图方便就在Main
类中开展代码编写),在中测通过后,痛定思痛,进行了代码架构调整,新增了FightLog
类,并将有关代码移入此类,恢复了Main
类只进行输入处理以及指令调用的特点。(值得一提的是,由于
checkstyle
的方法行数限制,我不得已将main
方法中的部分操作无脑移入一个乃至多个新的方法,而不是按照方法的步骤和功能拆分,这样的操作显然是应付checkstyle
的检查,不具备好的可读性以及可维护性,应在未来设计的时候得到考虑。) -
这是迭代开发的第四次架构。 学习了继承以及接口的概念和应用,引入不同种类的
Bottle
和Equipment
对应不同的功能(RegularBottle
、ReinforcedBottle
、ReinforcedBottle
、RegularEquipment
、CritEquipment
、CritEquipment
),于是我将每一个种类分别视为Bottle
和Equipment
的子类,继承出相应的类。此外还引入了价值、价值体的概念,由于Food
、Equipment
、Bottle
等类作为价值体有着大量相同的方法,于是我新增了Commodity
接口,从而很方便地对各种种类的价值体进行管理。 -
这是迭代开发的第五次也是最后一次架构。 新增了金钱、商店的概念,于是我在
Adventurer
中新增属性money
,同时新增Store
类进行买卖以及交易日志的操作管理,但很遗憾的是,由于我对工厂模式的理解不够深刻,在此次迭代中我并没有采用工厂模式以及观察者模式相关操作,这是因为我认为其在代码行数以及理解上不具备优势,但事实上,这种设计模式对代码重用、代码可读性以及代码可靠性都有很大的帮助,我将在未来的工程中尽可能采取这种做法。
最终架构设计
最后,从全局来看。本次项目在进行设计以及重构的过程中,尽可能向高内聚低耦合靠拢,以提高代码的可维护性、可读性以及可靠性。总的来说,我用Main
类进行统一的数据输入和处理分析,调用在其他类中的相关方法;设Adventurer
类对Bottle
、Equipment
、Food
类进行管理;用FightLog
类完成战斗日志相关内容;用Store
类完成买卖相关操作;Commodity
接口实现对各种价值体的管理。
所有类如下:
2. 使用Junit心得体会
我认为刚开始使用Junit
时我的初心是希望其能为我debug服务,事实上刚开始写的时候也是如此,我针对不同的方法写了不同的测试,并用assertEquals
语句判断结果是否与预期一致,并取得了很好的效果。但是后期,由于追求覆盖率,我不得不为Main
类编写测试,这也就违背了Junit
的测试初衷,并且由于部分方法的参数设置使之难以进行一般构造并调试,因此我在Main
的测试中整体写入样例,但好处在于它可以初步分析错误可能在哪些代码块中,并且结合单步调试以及断点进行进一步找到问题所在。总的来说,我认为Junit
还是一个很好的debug辅助工具,但管理方法时需要做好参数处理,管理方法时需要做好参数处理。
3. 本学期学习oopre的心得体会
学习完面向对象程序设计先导课程后,我有了很大的收获,从程序设计基础以及数据结构的面向过程编程转化为面向对象编程,将抽象的东西具象化,使之更符合实际;此外代码可重用性得到提高:面向对象编程鼓励代码的模块化和封装,使得对象和类可以在不同的应用程序中被重复使用。通过创建可重用的类和对象,可以减少代码的冗余,并提高代码的复用性,从而提高开发效率;简化复杂性:面向对象编程允许将复杂的问题划分为一系列较小的、可管理的对象,使得代码更易于理解、调试和维护;提高代码的可扩展性和灵活性:面向对象编程使用封装、继承和多态等特性,使得代码具有更好的可扩展性和灵活性;提高团队协作效率:面向对象编程将代码分为类,提供了接口,使得多个开发人员可以同时开发不同的模块,大大提高了团队合作的工作效率。
此外针对每次作业中遇到的问题,我认为在开始开发前,应该充分构思合理的架构,尽量做到高内聚低耦合,而不是一股脑增加代码实现功能,这样在小的工程中可能没什么问题,但在大的、多人合作的工程中往往会引发一系列不可预知的问题。同时应该将面向对象的思想进一步在编程中体现,而不是面向c语言编程,利用封装、继承、多态对对象进行创建和管理。
4. 对oopre课程的简单建议
- 对Junit的要求可以适当放宽一点,不然硬凑覆盖率属实没什么必要