OOpre 面向对象先导课 学习总结

一、项目架构

最终架构展示

下图展示了最后一次作业项目中各类、接口之间的关系
项目架构

可以看出,Adventure作为操作Bottle、Equipment、Food这三项物品的类,设计层级高于这三个类,而Bottle和Equipment通过继承又实现了特殊效果的Bottle和Equipment。

但最终,这四个大类都属于价值体,有相同“计算价值”的行为,因此使用Commodity接口,在各个类中进行实现。

最后新增的Shop类,由于商店有且仅有一个,采用单例模式的设计模式,虽然实际上该类的调用者也是我自己,但单例模式还是在很多地方十分便利,不需要传Shop对象,直接getInstance即可获取到唯一的商店。

二、JUnit使用心得体会

JUnit是我们开发过程中有时候令人不悦的一件事,尤其是对于我这种没有怎么以工程的方法、规范去写一个体量稍微大一点、设计结构更加复杂一点的项目的人。

即使了解一点java,但却从来没有考虑过“测试”的事情,只是见过“单元测试”这样的字眼,现在通过JUnit(实际上正是单元测试),我得以对测试这件事情多少有了点了解。

第一次听说覆盖率这个东西的时候,我觉得能把测试程度量化是一个很伟大的想法,以及分支覆盖率这样一个更有实际意义的指标,觉得测试确实是一个需要重视的事情,但听说我们的作业需要达成一定覆盖率甚至是一定的分支覆盖率后,我忽然觉得不那么喜欢它了,因为感觉这样的测试,靠自己随便设个情境然后调用,很难测出什么有价值的结果。

但直到在一次作业,对新增加的方法设计测试的时候,我通过测试一个随便编的奇怪数据,在assertEqual发现了错误,找到了一个罕见的bug,而且是中测没能测出来的,后来就顺利通过了强测。

后来我认识到,JUnit其实只是提供了一个工具,一个环境让你能够独立地进行测试。真正想要做测试的话,绝不是把覆盖率跑够就行了,而是可能多次在不同情况下进行调用,把每种可能情况都考虑清楚,要么进行特殊设计,要么进行饱和式测试。这样才更有效果。(前提是你清楚地知道这个方法应该实现什么效果)

三、学习OOpre的心得体会

1. Java入门

从一个只会写System.out.println(“Hello world”);到熟练使用各种内置容器以及各种常见方法,我通过OOpre的学习对Java语言进行了快速入门。

2. 面向对象思维的构建

进行OOpre学习以前,我无数次听说过OOP、面向对象、“一切皆对象”的说法,甚至在初中的时候就知道这个概念,但当我想进一步深究的时候,却觉得和我会写的那种代码完全不一样,于是就放弃了。

这学期OOpre,是我第一次真正系统地进行面向对象编程,在最开始,那简直就是噩梦:我会觉得写了一个又一个方法,很长,也很蠢,好像在写作文时候凑字数一样。而尤其是有时候进行几个操作的时候,习惯了面向过程的函数式编程的我,可以在一行语句里写出四五个".“或者”( )"去调用各种方法,我只觉得面向对象难用。这个时候,在我的思维力,从面向过程入门的编程思维在本能地抗拒使用面向对象。

而当迭代逐渐开始,项目需求逐渐复杂而且有时候需要面临小小的整体改动的时候,我发现通过对类增加/删改一些属性/方法,就可以达到一个“牵一发而动全身”,简洁而迅速地进行了开发,而且代码可读性很高。

后来,面向对象的思想已经在我脑中占据一席之地。现在回首看到这个项目,却发现我已经很难想象如果使用面向过程的方法,如何开发这样的项目,感觉代码会既冗长又缺乏可读性。

3. 对于工程开发的能力提升

在这门课前,不论是C语言程序设计,还是数据结构,其最终目标就是在OJ上AC即可,也没有中测强测这样令人不得不自我检查的机制。

因此在之前的编程中,不论是代码风格、变量命名,甚至函数方法
、调用是否规范符合逻辑等,都可以以“AC即可”的理由忽视。

但OOpre的迭代开发、强测“威慑”、checkStyle分数都让我在代码规范和架构设计上花了比以往多得多的心思。慢慢的,标准的变量小驼峰命名和在各种地方加空格的习惯已经形成了肌肉记忆。

4. 调试能力大幅上升

为了保证强测的期望分数较高,有时候免不了进行大数据的生成与对拍测试,而当我发现我的代码存在问题的时候,我就需要对于程序进行仔细地检查,我不仅通过脑中模拟、IDE调试,还会构造会出现类似不一致的小数据以进行人肉模拟,在这个过程中,我对Java语言特性有了很多认知,调试能力也有了很大提高。

四、对OOpre课程的建议

在OOpre的学习过程中,课程组提供了很多的帮助,不过还是有一个地方让我感到可以优化。

在一开始开发的时候,由于功能简单,所以对于一些需求的实现可以有很多种,但随着后面需求增加,可能在课程组或者一种主流的思路来看,新增加的内容只是在原来思路上的增加和些许的修改,但如果实现方法不太一样的同学就需要重新构建逻辑,最终不得不向“主流思路”靠拢。

所以如果在一开始对未来方向和数据保证、要求有所暗示,会不会体验更好呢(比如不同类型之间的id不会重复)

不过也许这也是日后工程开发的一个一定会经历的体验,或者课程组本身也有类似的考量。

不论如何,十分感谢吴老师和各位助教们的帮助,我在OOpre这门课程中受益颇多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值