2023秋 BUAA 面向对象程序先导(OOP)课程总结

文章讲述了作者在OOP课程中通过实例开发冒险者管理系统的过程,包括架构设计的迭代、使用junit进行单元测试的心得以及从面向结构到面向对象编程的转变。作者强调了代码重构、单元测试和面向对象编程的优势。
摘要由CSDN通过智能技术生成

架构设计

在OOP课程作业的代码迭代开发过程中,实现了冒险者的管理系统,支持冒险者进行不同类型的活动并提供对指定信息的查询功能。代码的最终架构设计如下图所示:
在这里插入图片描述

所有的类
在这里插入图片描述

架构说明

  • Main类中通过MyScanner类读取输入,将控制台输入读入二维数组,而后通过Manger类处理输入。
  • Manager类实现核心功能,在其中通过一个容器adM管理所有冒险者,再由一个容器fightLog管理所有战斗记录。
  • 通过单例模式实现Shop类,实现与冒险者之间的物品买卖交互。
  • Adventurer类包括冒险者的物品和属性,不同类型的物品通过相应的容器进行管理。
  • Adventurer、Food、Equipment、Bottle类作为价值体,需要实现Commodity接口,以获取价值体的价值。
  • Bottle作为父类,子类RegularBottle、RecoverBottle、ReinforcedBottle对其进行继承,以实现不同类型的Bottle的功能。同样的,Equipment作为父类,子类CritEquipment、EpicEquipment对其进行继承,以实现不同类型的Equipment的功能。

架构调整

  • 在最初的设计中,在Main类中通过Scanner逐个读入每条输入,并用switch-case结构进行处理,但这并不是一种好的读取方式,随着代码量的增大,必须将Scanner类传入每一个函数中才能继续读取。于是调整为使用一个二位数组来一次性读取所有输入,再对其进行处理。
  • 在迭代开发过程的早期,主要逻辑函数集中在Main类中,随后发现这是多此一举的,于是为Adventurer等类增加了更多的功能函数,迁移Main类中的函数,实现了一定程度的解耦。
  • 事实上笔者在作业迭代过程中,对架构并没有进行过多的考虑,而是本着通过测试就万事大吉的想法,将大部分处理函数放在了Main类中,导致在最后一次迭代作业的提交中,Main类已经达到了400多行,十分臃肿,近乎要超过500行的限制。于是在迭代开发完成之后,对整个代码结构进行了重构,主要是对Main类进行“瘦身”,将其中的大部分函数迁移到了Manager类中,实现了代码的解耦,并且新创建一个类MyScanner来集中处理输入,避免Main类中的代码堆积。

junit使用心得

  • junit测试框架为我们的代码质量提供了有力的保障,通过对每个类的单元测试,可以很好地发现代码中的bug,提高代码的稳定性。同时,通过junit进行单元测试可以在添加新功能或重构现有代码时快速验证更改是否破坏了现有功能。这种测试驱动的开发方法不仅加深了我对代码行为的理解,还使得维护和扩展项目更为容易。总的来说,在使用junit的过程中,笔者从一开始对写junit测试的抗拒,逐渐认识到单元测试是面向对象编程实践中不可或缺的一环,不再为了满足覆盖率要求而写单元测试,而是养成了每加入新功能时都及时进行单元测试的习惯(希望能够保持)。
  • 此外,笔者分享一种用junit进行样例测试的技巧,如下代码段所示,可以创建对Main类的test,并在其中构建多个测试函数来进行对不同样例的测试。这样的好处,一是在使用二维数组处理输入后,一个麻烦之处就是每次进行样例输入必须算好输入的行数,而这样的测试方法可以避免这一问题,直接将测试样例放在input字符串中即可;二是通过这样的方式可以比较好的存储自己的测试样例随时调用,并且运行之后还可以通过junit的覆盖结果(可以通过颜色查看是否运行了该行代码或通过了该段分支)很直观的进行bug调试;三是这样可以很方便地构造样例快速达到覆盖率要求而不用苦逼地测试每个类的功能(bushi,当然还是建议大家认真对每个类进行单元测试,这样才能更好地加强代码的稳定性,吴老师也在最后一节课上再次强调了企业级代码单元测试的重要性。
    在这里插入图片描述

oopre学习心得

面向结构编程和面向对象编程是两种主要的编程范式,它们在设计和开发软件应用时各有优势。在迭代开发的过程中,我实现了从面向结构编程到面向对象编程的转变。

事实上,笔者先前在对python的学习中,对面向对象有粗浅的了解,简单的把面向对象当成Class的使用,经过OOP的学习才初步理解了面向对象的“博大精深”。

面向结构的方法强调程序的步骤和过程,通常通过函数来分解问题。在这种方式中,我们将问题分解为一系列的步骤,然后将这些步骤转换为函数,数据可以自由流通于函数之间。而面向对象编程引入了“对象”的概念,这是包含数据和功能的实体。我掌握了如何将数据和功能封装在一起,更注重抽象和模块化。这种转变的一个主要好处是代码的可重用性和可维护性得到了增强。对象的使用使我能够更容易地理解和管理代码中的复杂性。

在实践中,我也体会到了面向对象编程在扩展和修改代码上的便捷性,可以再添加新的对象或修改现有对象时不影响其他部分。尽管本学期的OOP学习并没有设计团队合作,但已经可以感受到面向对象编程在团队合作中的优势,可以让不同的开发者独立工作完成不同的对象。当然,适应这一转变也需要一定的时间多加练习,尤其需要改变思考问题的方式,必须从对象和它们之间的关系来构思问题,而不仅仅是从逻辑流程出发。

通过Java进行面向对象的学习是很有趣的,Java作为一种强类型的面向对象语言,通过类和继承,让我对其有了更深的理解。笔者也认识到面向对象编程不仅仅是一种编程技巧,更是一种思考和解决问题的方式。

课程建议

总体课程安排和设计很精彩!提供一些小小建议:

  1. 每次作业的时间限制还是稍显紧张,不知道有没有可能再适当放宽一些,让同学们有更多的时间去思考问题,而不是为了赶ddl而赶ddl。
  2. 或许对于某些久攻不下的测试点可以提供一些小hint?尽管个人没有遇到这种情况,但可以想见面对一个没有提供数据又始终不过的中测点去debug是一件很痛苦的事情orz。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值