北航22级面向对象先导课总结BLOG

面向对象先导课总结BLOG

一、架构设计

本次作业经过多次迭代最终成型,在编写框架的过程中,开始仅有一些简单的Adventure类的操作,附带一些对Bottle、Equipment、Food的操作,封装意识不强,很多方法直接写在顶层,给后面的增量开发带来了一定的困难,增加或者更改需求往往会大改之前的代码。但经过几次改进和优化重构后形成了现在的架构。

1. 现有架构图

在这里插入图片描述

2. 架构解释

  1. Main作为主类,负责处理输入输出,对Adventure类进行操作;
  2. Adventure类需要对Bottle类、Equipment类和Food类进行管理和操作,设置容器对其进行管理,同时在后来增加雇佣功能之后增加Adventure类的管理容器。
  3. 对于BottleEquipment类的分类,通过构造子类继承父类的方式实现。其中,对于Bottle的使用,设置UseBottle接口处理不同类的Bottle的使用操作;对于Equipment的使用,采用UseEquipAttack接口实现对不同类的Equipment的使用。
  4. 战斗模式的实现:实现一个FightLog类,通过 deal方法处理读取战斗日志的表达式,用正则表达式将其匹配为matche1,matche2,matche3三种战斗模式,使用药水和战斗方法设置为static以供Adventure调用。同时,将每一条成功的战斗日志以输出字符串的形式存储在FightLog中的全局战斗日志容器、Adventure类中设置相应的作为攻击者和被攻击者的容器存储日志。
  5. 商店的实现:采用单例模式,有且仅有一个商店。每次需要商店时仅需调用该商店即可。同时,考虑到后面的买卖功能,设置了Bottle容器、Equipment容器和Food容器,记录商店买入的物品。单例模式代码如下:
    private static Store store = new Store();
    public static Store getInstance() {
        return store;
    }
  1. 价值体的实现:本次任务中,我最终采用了Com类作为一个价值体类,AdventureBottleEquipmentFood类均继承该父类,并用一个HashMap<Integer, Com>实现对价值体的管理。我认为实现该类有以下好处:
  • 统一管理Adventure的所有价值体,便于统计Adventure的总价值和所携带的最大价值体。
  • 进行买卖操作时,可售卖的物品以价值体形式卖出而无需关注其具体种类,或者说具体的买卖功能交给了商店。
  • 和Commodity接口配合使用,更普遍地使用价值体的某些共有方法,例如getPrice()

二、使用Junit的感受

之前的程序设计、数据结构等课程的学习中,要想检验程序是否有bug,或者想要得知自己的程序哪里出了问题,往往需要自己构造样例,一组组地手动输入,根据输出结果和标准答案比对。
但是,这样的方法仅仅适用于相对小规模的数据和工程,在本学期学习了面向对象先导课程之后,尤其是在一次次迭代代码做增量开发的时候,以前的debug方法、或者说检验方法显得不太可行。
而使用Junit,不仅仅给我们代码开发的过程带来了便捷,也给我的思维带来了一定的启发。首先是Junit可以从整体到局部进行检测,即我们不仅仅只能从输入输出中获取信息,更多时候我们能对某一个或者某几个类进行检测以确保局部模块的正确性,在修改代码时也不用因为某一处而改动全局;其次,Junit中要求的各项覆盖率的指标,也对构造数据和测试方法提出了比较高的要求,一方面它能使我们构造出相对更强的数据,更全面地测试我们的程序,另一方面也能让我们更快地将可能出错的地方定位到某个类,某个方法,甚至某个分支,也就要求我们的代码有着良好的封装性,和规模上的限制,形成更好的代码风格;使用Assert方法检验结果,用一种相对自动的方法,快速地帮助我们检查代码的规范和正确性。
总而言之,在实际的代码开发的过程中,使用Junit给我带来了极好的体验,很多时候能使代码的检查工作达到事半功倍的效果。

三、 学习oopre的心得体会

学习oopre,给我带来的最大影响,是编程思维由之前的面向过程转向面向对象,在实际代码开发中形成了一定的工程化思维和规范思维。
就编程思维的转变来说,因为面向对象的封装、继承、多态的特征,与之前面向过程有着极大的区别。
以往面向过程的编程过程中,往往只针对某些小的单一的任务,采取一气呵成的方式完成某个程序。但在实际需求中,要做到这一点是十分困难的。而面向对象的思维告诉我们如何把交互的对象封装起来,同时实现业务处理和逻辑控制处理的分离,将大问题拆分成小问题分开处理等…这样的方法,通常能够使不同类和不同操作实现解耦,使得问题结构更加清晰。
在代码增量开发的过程中,时常会遇到老的思维不适用于新需求的问题,开始我的做法是对某些代码推翻重写,但是这样的效率太低,于是后面我对各种方法进行尽可能的解耦操作,在新增需求的过程中争取做到只对某一部分进行操作改进达到预期效果。
当然,在提交每次作业的时候,也许还会遇到因为代码格式不符合要求而对某些代码重写甚至是重构的情况,以及后来在使用Junit时对覆盖率的要求等等,都让我在一次次改进中明白到体系化和规范化的重要性,从而学会在开始就以一种系统化的方式规划代码,在写的过程中就注重规范性。
总结来说:在oopre的学习过程中,我实现了从面向过程到面向对象编程思想的转变,也在实际作业的代码开发中学会以更加规范化和工程化、体系化的思维看待问题,更重要的是在一次次解决困难的过程中学习了如何在实际开发中寻找问题源头并解决问题的方法。相信这样一段学习过程会给我在未来的不管是面向对象正课的学习或者是实际的开发工作中给予巨大的帮助。

四、 一点建议

希望以后助教能够开展一些线下与同学们交流的机会,可以增加一些答疑或是经验分享的环节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值