OOpre 课程总结

OOpre 课程总结

架构设计

项目结构图

顶层的 Main 类主要实现输入的解析与操作种类的识别判断,并将相应的指令传递给 Database 类,Database类管理相关操作。Database 类中直接管理了 Adventurer 类和 Fightlog 类。Adventurer 类下又管理了 Bag 类和 Equipment 类、Bottle 类、Food 类。

同时,还实现了一个 Commodity 接口和一个 Shop 接口。Adventurer 类、Equipment 类、Bottle 类、Food 类在许多 get 方法和属性上有相似之处,将它们都放在 Commodity 接口下来管理。Shop 接口实现了三种价值体的 Shop,并都采用了单例模式。

在几次的迭代中,我侥幸的在总体架构上都没有过较大的改动,在一些比较关键的设计上,我都在最初就采用了较为合适的做法,或是比较快的“迷途知返”,找到了更加正确的实现方法并尽早修改,从而避免了较大范围的重构。个人认为的几个比较关键、易于出现错误的设计主要有:

  1. Main 类中的方法总长度限制问题。在第一次迭代时,我类似于之前打算法竞赛做大模拟题的思路与做法,将所有过程的实现都放在了 Main 类下。这样做在不久后就会受到方法内的行数限制,并且更重要的是这种做法违背了面向对象的设计原则。因此我在不久后便新实现了一个 Database 类,管理所有的冒险者、战斗日志等信息,并在内部实现了各种对冒险者的操作方法。
  2. Bottle 的使用。在出现 Bottle 的使用操作后,我在 Bottle 类中添加了 isFull 属性用于判断 Bottle 是否被使用,而非将它的容量设置为 0。这样做更加直观、准确的描述了 Bottle 的属性,并且在未来的迭代中避免了一些潜在的错误。
  3. 在出现携带操作的时候,我实现了一个 Bag 类,用于管理冒险者携带的各种物品。而在 Bag 内部,由于一些物品的使用是按 name 检索,并且优先使用 id 小的,所以我使用了一个 HashMap<String, TreeMap<Integer, …>> 来管理 Bag 中的物品,这样做非常直观方便,效率比较高,并且在增加、删除等操作中避免了使用迭代器来遍历容器,在删除时也不容易出现空指针错误。
  4. 实际上,在出现价值体的概念之后,我只实现了一个 Commodity 接口,并将四个价值体类放在了这个接口下,实现了接口中的属性和方法。但除此之外,我并没有真正运用上接口的便利,例如在查询最大价值体、查询相应 id 的价值体的操作时,我仍然采用的是遍历四个类的容器并在其中查询的方法,而事实上,实现 Commodity 接口后,可以直接增加一个 Commodity 的容器,直接在这个容器中实现各种查询方法,从而避免了同质操作的反复实现,真正发挥接口的优势。

使用 Junit 的心得体会

Junit 对于我而言是一个新奇的东西,同时也是面向对象设计思想的一个非常好的体现。以往打算法竞赛、面向过程编程时,我主要的调试方式是基于局部操作的输出中间变量,或基于全局代码的构造数据或对拍。然而,面向对象设计时,测试的主体应该是“对象”,使用 Junit 可以很好的检测出对象的方法是否正确实现,确保了方法的正确实现,并层层向上检测,能够准确快捷的定位问题。

另外,Junit 还提供了测试覆盖率这一数据,可以较为有效的作为一个测试强度的评价指标。然而,测试覆盖率并不能完全作为评价测试效果的指标,还需要考虑到测试的完备性、饱和度,充分的对可能出现的情况进行全面地测试。

总的而言,Junit 是面向对象设计思想的一个体现,并且能够很好的帮助我们在程序设计的过程中发现、定位问题,并进行修改验证。

学习 OOpre 的心得体会

  1. OOpre 让我学会了 Java 的基础语法,并且了解了相关容器的使用。我在先前写 c++ 的时候对 STL 有一定的了解,上手相关的容器比较快,然而 Java 中的这些容器和 STL 中的容器有一些区别,在 OOpre 课上我也对这些区别有了相应的了解。并且 OOpre 还鼓励我去了解了更多的容器相关知识,例如 HashMap 在冲突较多时会自动转为红黑树进行管理,从而避免大量的哈希冲突造成的性能下降,而不像 STL 中的 unordered_map 一样,容易被可以制造出的数据卡成最坏情况下的 O ( N ) O(N) O(N) 复杂度,这一点让我感觉非常神奇。

  2. 通过 OOpre 的学习,我初步掌握了面向对象的设计方法,并在设计实践中主要采用 自底而上 的设计思路,先对底层的对象和方法进行设计,再逐步往上设计构造。

  3. 在完成 OOpre 作业的过程中,我还自行编写了作业的数据生成器,生成数据规模较大的数据,对代码进行充分全面的测试。编写数据生成器的过程也给我的 Java 代码编写能力带来了一定的提升,在每次迭代任务完成后还需要对我的数据生成器进行相应的完善和迭代,这对我而言也是一种挑战,在解决设计数据生成器中遇到的各种问题的过程中,我得到了很多的收获,掌握了一些测试的基本方法。

  4. OOpre 还从零教会了我使用 git,让我更清晰的认识到了 git 的强大,同时也纠正了我先前对 git 的错误认识。

对 OOpre 课程的简单建议

课程设置总体上非常不错,希望能够在每次迭代结束过后公开一些好的设计架构与设计思路,在迭代的过程中进行学习和优化完善。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值