2023面向对象程序先导总结

2023面向对象程序先导总结

1. 作业最终的架构设计, 在迭代中的架构调整及考虑

​ 本次作业经过五次迭代最终实现了关于冒险者收集各种道具,使用各种装备,招募其他冒险者加入队伍,提升自己的等级并体验各种战斗以及购买和卖出价值体等操作。

迭代中的架构调整及考虑
  • 这是迭代开发的第一次架构。 我建立了MainAdventurerBottleEquipment类,利用容器管理所有冒险者,并管理每一个冒险者所拥有的药水瓶和装备。但在第一次架构中,由于经验不足,将输入输出等大量代码放在Main类中,并且在main方法中代码长度接近60行,导致可维护性、可读性较差。

  • 这是迭代开发的第二次架构。 新增背包的概念以及Food类,我在新增功能实现代码的同时,调整了代码架构,Main类中负责输入处理分析以及指令调用,具体的操作在其他类中实现,减少了Main类的代码长度,提高了可读性和可维护性。

  • 这是迭代开发的第三次架构。 引入战斗模式与战斗日志(FightLog)的概念,利用正则表达式等内容进行日志读入。但在这里又犯了hw2中犯的错误,将新增的有关大量的代码放在Main类中,造成Main类代码冗长,并且降低了可读性和维护性(当时如此设计是认为adventurers置于Main类中,为图方便就在Main类中开展代码编写),在中测通过后,痛定思痛,进行了代码架构调整,新增了FightLog类,并将有关代码移入此类,恢复了Main类只进行输入处理以及指令调用的特点。

    值得一提的是,由于checkstyle的方法行数限制,我不得已将main方法中的部分操作无脑移入一个乃至多个新的方法,而不是按照方法的步骤和功能拆分,这样的操作显然是应付checkstyle的检查,不具备好的可读性以及可维护性,应在未来设计的时候得到考虑。)

  • 这是迭代开发的第四次架构。 学习了继承以及接口的概念和应用,引入不同种类的BottleEquipment对应不同的功能(RegularBottleReinforcedBottleReinforcedBottleRegularEquipmentCritEquipmentCritEquipment),于是我将每一个种类分别视为BottleEquipment的子类,继承出相应的类。此外还引入了价值、价值体的概念,由于FoodEquipmentBottle等类作为价值体有着大量相同的方法,于是我新增了Commodity 接口,从而很方便地对各种种类的价值体进行管理。

  • 这是迭代开发的第五次也是最后一次架构。 新增了金钱、商店的概念,于是我在Adventurer中新增属性money,同时新增Store类进行买卖以及交易日志的操作管理,但很遗憾的是,由于我对工厂模式的理解不够深刻,在此次迭代中我并没有采用工厂模式以及观察者模式相关操作,这是因为我认为其在代码行数以及理解上不具备优势,但事实上,这种设计模式对代码重用、代码可读性以及代码可靠性都有很大的帮助,我将在未来的工程中尽可能采取这种做法。

最终架构设计

​ 最后,从全局来看。本次项目在进行设计以及重构的过程中,尽可能向高内聚低耦合靠拢,以提高代码的可维护性、可读性以及可靠性。总的来说,我用Main类进行统一的数据输入和处理分析,调用在其他类中的相关方法;设Adventurer类对BottleEquipmentFood类进行管理;用FightLog类完成战斗日志相关内容;用Store类完成买卖相关操作;Commodity 接口实现对各种价值体的管理。

所有类如下:

在这里插入图片描述

2. 使用Junit心得体会

​ 我认为刚开始使用Junit时我的初心是希望其能为我debug服务,事实上刚开始写的时候也是如此,我针对不同的方法写了不同的测试,并用assertEquals语句判断结果是否与预期一致,并取得了很好的效果。但是后期,由于追求覆盖率,我不得不为Main类编写测试,这也就违背了Junit的测试初衷,并且由于部分方法的参数设置使之难以进行一般构造并调试,因此我在Main的测试中整体写入样例,但好处在于它可以初步分析错误可能在哪些代码块中,并且结合单步调试以及断点进行进一步找到问题所在。总的来说,我认为Junit还是一个很好的debug辅助工具,但管理方法时需要做好参数处理,管理方法时需要做好参数处理。

3. 本学期学习oopre的心得体会

​ 学习完面向对象程序设计先导课程后,我有了很大的收获,从程序设计基础以及数据结构的面向过程编程转化为面向对象编程,将抽象的东西具象化,使之更符合实际;此外代码可重用性得到提高:面向对象编程鼓励代码的模块化和封装,使得对象和类可以在不同的应用程序中被重复使用。通过创建可重用的类和对象,可以减少代码的冗余,并提高代码的复用性,从而提高开发效率;简化复杂性:面向对象编程允许将复杂的问题划分为一系列较小的、可管理的对象,使得代码更易于理解、调试和维护;提高代码的可扩展性和灵活性:面向对象编程使用封装、继承和多态等特性,使得代码具有更好的可扩展性和灵活性;提高团队协作效率:面向对象编程将代码分为类,提供了接口,使得多个开发人员可以同时开发不同的模块,大大提高了团队合作的工作效率。

​ 此外针对每次作业中遇到的问题,我认为在开始开发前,应该充分构思合理的架构,尽量做到高内聚低耦合,而不是一股脑增加代码实现功能,这样在小的工程中可能没什么问题,但在大的、多人合作的工程中往往会引发一系列不可预知的问题。同时应该将面向对象的思想进一步在编程中体现,而不是面向c语言编程,利用封装、继承、多态对对象进行创建和管理。

4. 对oopre课程的简单建议

  • 对Junit的要求可以适当放宽一点,不然硬凑覆盖率属实没什么必要
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值