2023秋季oopre个人总结

前言

        在大一的时候经过程设和数据结构的学习,我初步了解如何用编程语言,并解决一些简单问题。在大二上学期,学院对所有学生开设面向对象程序先导,虽然只有短短的八周,但它的课程还是非常"硬"的。在这八周五次迭代和两次debug会让你体悟到真正的苦痛,并因此“重获新生”,为下学期的正课打下坚实的java面向对象的基础。

项目架构

最终项目结构

      

          这是经过五次迭代后的最终项目结构图。项目入口Main,在Main类中将输入解析,根据输入的不同调用下层的Adventurer类中的方法,Adventurer是项目的核心,其他类的方法需要直接或间接的通过Adventurer中的方法来实现,主要实现的有对下层物品如食物,装备,药水的操作,不同冒险者之间的攻击,雇佣。同时每个冒险者有一个背包,放在背包中的物品视为已携带,最终物品的使用方法放在背包中实现,保证一定使用的是携带的物品。

           同时在Main中我们创建了Store和Log的静态类。其中Adventure可以通过Store来进行买和卖两种操作,之后根据返回参数增加,减少物品;战斗日志log在解析日志合法性后会驱动冒险者完成对应操作,并写入冒险者日志。

            接口Commodity作用一方面是所有价值体都有公共方法计算本身的价值,另一方面利于其他方法的实现。如对价值体的操作,将价值体放在一个容器中,减少管理不同类的容器带来的麻烦,对于价值体的操作可以直接对当前价值体容器操作,不需要根据类别寻找不同的容器来实现。

迭代阐述

        I.创建与删除

         在项目的最初,六条需求中,对冒险者,物品的增删。本质上是掌握对类的创建方法和对容器的使用。由于各种对象都是建立在id来唯一索引的,只需在在Adventure中建立三个HashMap来表示拥有的物品。增加功能在创建好对象后放在容器中,删除功能是需要使用容器自带的删除方法。

        II.携带与使用

        第二次迭代中,我们需要对已拥有物品进行携带与使用。由于引入了背包这一概念,新创建类Knapsack,背包中也有三种容器来存储物品来表示携带。本次迭代对于使用功能考察的是对容器的熟练应用,分析需求后,需要做到先按名字检索,再按id检索找到应该使用的物品。第一层索引使用HashMap,第二层要求id有序采用TreeMap。

        III.正则表达式的匹配

        这一次与前面的相关性不大,将正则表达式匹配成功后,合法性检测,驱动冒险者完成对应操作。但课程组是很机灵的,按照顺序来的1,2,3匹配规则其实具有误导性,满足3规则一定满足2规则,满足2规则一定满足1规则。需要理清正则的包含关系后进行匹配。(就是因为开始没注意傻傻去匹配导致错误)。

        IV.类继承与接口

        第四次迭代是对于项目改动最多的一次。它考察了子类和接口的使用。

        本次作业要求扩展Bottle和Equipment带来许多功能上的改变。当然对程序的大肆改动一般是很危险的,这也是我第一次强测失分的原因。原有的Equipment中的attack方法和Bottle中的drink方法需要重写,虽然返回值相同,但传入参数已经和前面大不相同。另外,由于计算方式的改变,引发一些判断结构的错误,如攻击和使用药水后可能并不会引起体力值变化。而我的许多判断使用和攻击是否有效立足于是否引发体力值变化,这与现在的要求不符合,导致许多方法需要重构。

        另外作业引入了价值体这一接口。课程组在引导上做的还是别有用心的:“将冒险者,以及冒险者持有的物品视作价值体”。对于价值体总价值的计算,以及寻找最大价值体我们可以将它们放在同一个容器中,然后遍历计算就行。不需要分别遍历各个容器,这也是创建接口的一个好处。

        V.唯一创建和观察者模式

        最后一次迭代新增加了两个大功能,但总体相对于第四次的大改动比较简单。需要明确的是商店和日志类一样,只需要创建一次。

        观察者模式需要明确谁被观察,谁在观察。一个冒险者可以被多个冒险者雇佣,同时观察多个对象是复杂的。于是让冒险者自己观测自己,这样相当于一对一的观察,比较简单。当自己体力值降低后,调用援助方法。

项目的不足分析

        在最初的时候,需求不多,我们可以将输入录入main方法让后在驱动其他方法使用。但由于功能增加,到最后23种功能,如果全部放在main中,将会臃肿。我是全部放在main类中进行解析,在这门课的开始,课程组就引导我们要尽量封装,作为一个大项目,如果把实现方法放在main类中将会十分失败。

        我认为可以采用scannextLine的方法读入一整行,传入一个operate的方法,对一整行输入进行解析,分离出有用的参数,进行调用方法。这样既封装了对输入解析的过程使main完全作为入口,而且不易出错,项目结构清晰。

junit使用心得

        项目的测试是保证自己代码用少的次数通过公测,降低强测失分可能的最好办法。覆盖率是一大关键,这表明你是否尽可能测试多的可能。在最初为了省事,采用顶层函数调用,不采用断言,只是为了达到覆盖率的要求。在测试上偷懒是要付出代价的,有时候确实会因为某个分支没有完全覆盖而这个地方确实发生了bug导致debug过程异常痛苦。

        因此,我们必须要按照一种规范的测试格式来。即对单个方法进行测试,采用断言,判断当前方法是否正常运行,这样能够清晰的知道自己某个方法是否存在问题。在出bug时也能从上千行的代码中即时寻找出bug。另外,课程组一直在强调通过中测不代表项目不存在bug,这部分的bug如果没有搭载评测机的话,就需要通过junit的边缘性数据来测试。

        另外对单个方法进行逐一测试也是利于我们书写测试代码,我们很明确当前需要的数据有哪些,需要覆盖的分支是什么,最终应该实现的结果是什么。由此,个人认为可以从单个底层方法开始测试,确保底层方法无误后,逐渐向上层测试,最终测试到整个项目。

学习oopre心得

         良好的代码风格

        代码风格强调规范性具体在于:代码的可读性,添加新功能的难易程度,和维护成本。可读性是最关键的,其中很重要的一点是封装方法,功能模块化。oopre课程是需要不断迭代的,在迭代过程中如果无法正确理解前面的代码功能,或者更进一步难以增添新功能是非常致命的。模块化封装方法,使得我们理解某一部分代码实现的功能,项目是由一个一个规范简洁的代码块有机组成的,对于debug,加需求的操作程序员实现起来也比较简单。而且模块化也提高了代码复用率,在项目堆叠起来我们仍可以使用前面的代码,减少每次作业的工作量。

        可读性也可以理解为美观,良好的代码风格写出来的代码是美的。命名的规范美,模块化设计的结构美,课程组的训练也是让程序员能够不自觉写出一份符合行业美学(标准)的代码,这也是多人合作项目工业开发的一项基础。

        面向对象概念的理解

        这门课程叫做面向对象程序设计先导。我们首先要理解什么是面向对象,即以对象为中心构建程序逻辑的方法。在程序上体现外在表现为我们将不在以C语言一个文件实现需求,追求过程而是围绕类描述对象,实现程序所需。

        这样编写的程序第一大特征是封装性,首先我自己的代码上main类已经完全变成一个程序的入口,程序内部实现逻辑将不在向外界透露。各个类中含有对象,以及与对象有关的方法,我们它们绑定在一起,在实现时只需要从外部给出一个指令,可以实现内部公共允许的方法来对内部操作。类中的属性是private,即无法被外部直接访问到的,这也提高了我们代码的安全,与这个类相关的操作只能通过这个类来实现,不能直接外部修改操作。

        第二大特征是继承性。类的继承是通过抽象层次来协同降低复杂性,子类可以继承父类的属性与方法,减少了重复代码的书写,同时子类也可以重写父类的方法,也可以写一些特殊于子类的方法。这样子类是在父类上的扩展,一切符合父类的操作均可以使用到子类上,比如将子类和父类放在同一容器中进行管理,子类使用父类的方法;而从容器中取出后,子类又可以和父类产生不同,子类使用重写父类的方法或者在判断是否是子类后采用子类自己的方法。

        第三大特征是多态性。在java程序中我们可以将同种操作但传参不同的方法命名相同,比如本次作业的出售,买入行为,会买卖不同的物品,我们定义相同的sell,buy函数,只是参数为各自的物品所属的类。它们对于传入的参数不同,产生不同的响应方案。

      对oopre课程的建议

        课程课上讲的有时太快过于笼统,对于很多初学者需要在课下大肆补习相关知识,仅仅依靠指导书内容有时完全不够,或者难以理解。希望可以适当增加课时,增加课上讲的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值