前言
本人在技术上仍存在很多欠缺,本博客没有任何作为榜样的价值,而是我个人对于这段学习过程中出现问题的反思和总结,希望读者能在我的经历和教训中有一定的收获,
一、项目架构
1.1 项目架构图
1.2 各类实现功能
Main
主类,只用来读取操作指令并存入数据表inputInfo中。Option
该类用于进行不同指令的操作。其中,在Adventurer
级别以上的属性将直接存入Option
类中,如opt15中的全部战斗日志journals
或冒险者集合adventurers
。另外,一些多冒险者层次的指令写在该类中。Adventurer
该类是另一个主要储存方法的类,主要涵盖针对单个冒险者的操作。另,对于冒险者的各属性,如仓库、背包、体力等,都将作为属性被储存在Adventurer
中。Bottle
该类使用继承,拥有三个子类RegularBottle
、ReinforcedBottle
、RecoverBottle
,共同继承父类的属性及方法。Equipment
同Bottle
类。Food
同Bottle
类,但无需继承,更加简单。Journal
我使用Journal
类来储存所有战斗日志,将战斗日志信息解析后存入Journal
中,优点是可以更全面地储存、更简单地调用日志中的信息。这个设计是我认为我比较有趣的设计。Shop
用以储存冒险者已售商品,并拥有计算新商品的价格和属性的方法。Commodity
接口,但在我的设计中并未被有效使用,在提交后才发现,是我对于本课程学习的纰漏,会在1.3中说明。
1.3 迭代中的架构调整
1.输入的处理
我在处理输入的过程中付出了很多努力,采用了三种思路,大规模调整了两次。在hw2的第一次迭代中,我将所有opt用if-else
等语句全进了Main
类的Main
方法中,在第二次迭代就到了checkstyle所要求的60行上限。因此第三次迭代,我选择将几个复杂的opt使用static void
的静态方法存在了Main
类中,但这样导致我在第四次迭代时的一些需要传参,改变参数的方法无法正常使用。因此我进行了第三次架构,新建Option
类来处理全部指令。
2.操作指令调整
最开始指令较少较简单时,我把adventurer
类作为装载全部操作方法的类。但这样在后来指令较多的时候,导致超过checkstyle要求的500行,并且代码可读性较差。于是我将部分操作调整至Option
类中,加强了这个架构的可读性和逻辑性。
3.关于每个类操作的考虑
为了便于操作,我在每个类中都增添了充足的指令,但相应地,在代码量逐渐增加的过程中,我的代码可读性变差,并且出现了冗余的问题;另外,我对于Commodity
接口没有正确使用,只是挂了个接口的名头之后仍然用的各个类的方法与遍历结合的算法。由于本次作业代码量较小,并且不会再继续迭代,所以我保留了原始的设计,但这样的设计是不可取的,我并不认可这次的架构,我也会在未来的新项目中做出调整。
二、Junit使用心得
对于Junit,我自知尚未理解其精髓,但我在试图刷覆盖率的过程中也理解- 了一部分Junit的操作以及思路。
- 由于在评测机上
assert
语句会出现问题,所以最开始我对Junit的理解更接近于机械地完成覆盖率的要求,而不在乎其本身的价值。后来,我在简单的测试中使用assertEquals
语句判断是否正确,了解到Junit的意义。 - 在编辑数据的过程中,我学会了编辑特殊数据,用以修复bug。但由于在本项目中我更多使用了断点和手敲指令手动判断的方法,所以没有具体的实施,但我也明白了编辑数据需要考量的地方。
- 在考覆盖率(尤其分支覆盖)的时候,我受到了debug思路上的启发。我们已经经过覆盖的测试,更大可能是正确的,而未经测试的部分更有可能是bug所在。
- 在写Junit的过程中,可以设置新的方法来简化代码(由于我的Junit长到看不清)
三、oopre课程心得体会
- 在这半学期课中,和大家有区别的是,我最大的收获便是自信。由于大一两门编程课成绩都一般,我也不认为我对编程擅长或者有能力完成编程任务。但在oopre课程的7次作业中,无论过程是否顺利,我都提交了作业并且通过了强测。这大大提升了我的自信心和动力。
- 从面向过程编程到面向对象编程,需要经历思维的大幅度变动。这让我逐渐理解了更大的项目是如何完成的。我原以为大项目只是使用更复杂算法,更庞大的代码堆砌而成,但自从了解面向对象编程,我便更懂得程序的架构以及程序实如何维护的,这开启了未来学习的新视野。
- 通过这门课,我阅读了更优秀的代码和良好的博客,这让我更加了解如何去学习,如何从别人的经验中获得提升,也更加了解我和优秀的编程者差距在哪里,这有利于我的不断进步。
- 对于git版本控制的学习也是不可或缺的,这方面的知识会大大利好接下来的工作。
四、一些建议
- 在第一周工具链教学时,最好提供更明确的教学视频或者更具体的教程,或者延时完成这项工作。
- 将课程群分为两个或者单独划分出讨论区,否则过多的讨论会冲散公告,在群里爬楼真的很影响效率。