1. 作业架构设计
- 其中Adventure, Bottle, Equipment, Food共同接入价值commidity的接口, 而RegularBottle 等三种不同类型的Bottle继承了父类Bottle,Regular Equipment等不同类型的Equipment 同理。
- Bag 作为Adventure的附属类,承担Adventure的背包功能。
- Logdate与 LogAdventure负责存放战斗日志。这里为了便于分别按照时间与冒险者查询战斗日志, 我选择在战斗时将战斗记录分别按时间存入Logdate类中,按冒险者存入LogAdventure类中(其中LogAdventure类与Bag类相似,都是作为Adventure类的附属类而存在),而LogAdventure又分成了negetive与positive两类(分别代表冒险者攻击的日志与受攻击的日志)。
- Store作为最后一次迭代中新增的类,在构造时使用了单例模式,实现了所有冒险者共同使用同一个商店的要求。
在数次代码的迭代中,比较重要的迭代是在第3次和6次作业。
- 第3次作业的重要变化是对于类的实现。在初步接触Java初期,由于对类的理解不够深入与对C程序的固有习性,我的代码中几乎所有的函数与属性都直接存放在了Adventure一个类中,没有充分体现Java语言的优势。而在第3次作业中,我初步实现了将函数按照功能放入不同的类中,初步体现了Java代码的优势所在。
- 第6次作业的重要变化是对原有代码的进一步提炼浓缩。在实现各种功能中不乏根据id, name等信息寻找到对应的Adventure, Bottle类的item的要求,但在此之前我一直都是在需要时通过for循环直接找到对应的item,而在第6次作业中同时出于代码风格与重复容易出现问题的考虑,我使用了比较长的对代码实现的重构,加入了findbotid一系列通过id, name等信息从以Bottle为变量的数组中找到对应item的函数,从而大幅简化了代码,提升了其可读性。
下为其中的一个样例。虽然这样的函数思路很简单,但很有效的实现了代码的精简。
static Equipment findequipid(int id, ArrayList<Equipment> equipments) {
for (Equipment equipment: equipments) {
if (id == equipment.getId()) {
return equipment;
}
}
}
2. 使用Junit的心得体会
- 初步接触Junit时我还是很勤勉地根据每一个函数写出对应的样例,并使用assert语句来进行对应的验证,也因此找到了不少自己代码中存在的问题,但随着后续代码的不断复杂化以及后来很多功能都发生了变化,导致新一次作业几乎不能继承上一次作业的Junit的test代码,过于繁重的任务使得我开始逐渐走向了为了快速实现覆盖率而直接套用测试样例投机取巧的道路,总而言之,在早期Junit确实帮助我发现了不少自身代码的问题,但后期过于繁重的任务确实成为了我逐渐走向敷衍的一个原因。
3. 学习oopre的心得体会
- 对于类与对象的理解。oopre让我首次从更偏向过程的C语言中走出,初步接触到了更偏向对象的Java,并学会了实现各个类的函数各司其职,共同构成一个分工明确而简洁明了的总体框架。
- 对于代码可阅读性的重要性的深入理解。在之前写C代码时,我很少在意自身代码的可阅读性,对于所谓的加空格,空行等要求很不理解。然而oopre课程中,最开始是为了满足checkstyle的要求,到后期是为了自身进一步的迭代而主动优化代码的架构,我对自身代码风格的要求也是逐渐的升高,其迭代与修正时的工程也更加简单明了。
4. 对oopre课程的建议
- 希望以后的先导课在最开始的作业介绍中可以更详细地介绍Java的基础过程,我自己当初从C程序走向Java程序的最初一周非常的迷茫,希望以后的课程能减少一些这样的可能。