一、作业最终的架构设计![](https://i-blog.csdnimg.cn/blog_migrate/98059f518020adc15ca443e79637cced.jpeg)
1、架构设计
Main : 指令处理Demon的入口。
Demon:1.读取指令,正则处理传入字符串数组,并分类指令,以及部分指令的实现。
2.其中包含advHMap(HashMap类)是用于储存所有的冒险者,logs(ArrayList类)是用于储存所有的战斗日志。
Adventure: 冒险者类,里面包含了部分指令的实现。
Log:战斗日志类,其中利用type(int)来区别三种不同的战斗日志,对于战斗日志内容的解析逻辑在Demon类进行
Shop:单例模式
Commodity:Adventure、Bottle、Equipment、Food类的接口,主要实现对价值的统一计算。
2、在迭代中的架构调整以及考虑
在hw6作业之前,我所有的指令读取、处理以及分类都在Main中进行,导致我的Main类高达300行。在阅读hw6给的改错代码后,我模仿它的架构,单独建立出一个Demon类进行指令的处理以及分类。
但是,目前我的Demon类行数也过多,我觉得我的层次化实现不够具体,有些可以另某个类单独执行的方法可以放在那一类执行,无需挤在Demon中,而造成各类长短严重不均的局面。
二、使用Junit的心得体会
在没有覆盖率要求之前,我走捷径(assert true),但也为我第一次要求覆盖率的作业付出沉重代价,记得那是ddl那天的下午,我速成构造test的方法,才赶在ddl前交上了。从那里开始我慢慢步入单元测试的正轨,学会如何构造特殊样例、尽可能覆盖所有的情况、对极端情况的检测。
但是在后期的各种覆盖率要求下,我的一些Demon类方法中包含Scanner,不知如何检测,所以branch、方法(这些类包含很多if-else语句)一直提不上去,也导致我大幅度调整代码,尽可能让包含Scanner的放在同一方法里,以多检测一些方法。
三、学习体会
在OOpre课之前,一位学长跟我讲过OO的一些类、方法等的实现,包括OOpre第一节课,吴老师向我们描述类与对象,当时我听的一头雾水,包括对于一些描述性质的符号(比如private,public,static等)更是觉得很复杂。
在第一次自己编写程序(也就是hw2)后,我对“对象”的理解才逐渐深入并领悟到面向对象和面向过程的C语言的极大区别。面向对象的“封装”以及可隐藏类中的部分属性、方法对之前只学过C语言的我来说,是一个全新的体验。封装可以减少耦合,高效利用代码行数,提高代码可读性,符合程序设计追求“高内聚,低耦合”的理念,并且可以实现类内部结构的自由修改,对属性、变量进行更精准的控制。以上虽然对我们现在已经是习以为常的事情,但是在我OOpre之前却是无法想象的。
同样的感觉发生在我学习接口与继承(hw5?应该是吧?),继承提炼多个类的重复部分形成父类,接口提炼了多个类共性的方法等,加大提高我代码的复用率以及灵活性。
我还想起最初还没有实现层次化的那几次迭代,我被CheckStyle一个方法不超过60行而折磨,当时把所有指令的实现都挤在一个方法里,后续学习以及迭代以及line的限制的意义也许就是在于教会我拆分,实现层次化,而且在学习过程中,我也深刻体会到这样更有利于代码的维护以及debug,也更有利于代码的可读性。
四、简单建议
希望能够注重检测Junit的编写方法的掌握,而非一味强求覆盖率👉🏻👈🏻
最后,要感谢OOpre课程组的老师和很耐心很负责的助教学长学姐们!!!