1、架构设计
我的代码总共分为13个类,分别是Adventurer、Backpack、Bottle、Commodity、CritEquipment、EpicEquipment、Equipment、Fight、Food、Main、RecoverBottle、ReinforcedBottle、Store。
Adventurer
包含的方法有第一次作业中的增减药水瓶、装备、食物,寻找拥有的药水瓶、装备、食物,以及最后两次作业中的雇佣冒险者、计算冒险者价值、清空背包、援助等操作。
Backpack
包含的方法有第二次作业中的携带药水瓶、装备、食物,使用药水瓶和食物,以及计算体力值的减少。
Bottle、RecoverBottle、ReinforcedBottle
Bottle类主要存放的是RegularBottle的各种属性,计算体力增加量的方法以及获取属性的方法。RecoverBottle和ReinforcedBottle是Bottle的子类,多了others属性,计算体力增加量的方法有所不同。
Equipment、CritiEquipment、EpicEquipment
Equipment类主要存放的是RegularEquipment的各种属性,等级增加的方法,计算体力减少量的方法以及获取属性的方法。CritEquipment和EpicEquipment是Equipment的子类,多了others属性,计算体力减少量的方法有所不同。
Food
Food类主要存放的是Food的各种属性以及获取属性的方法。
Fight
Fight类是关于战斗模式的类,有进入战斗模式的方法、判断是哪一种战斗模式的方法、判断是哪一种输出的方法以及输出的方法。
Commodity
Commodity是一个接口,Adventurer、Bottle、Equipment、Food都接在Commodity上,因为这四个类都需要获得price和type。
Store
建立Store类时用了单例模式,因为Store有且仅有一个。包含购买时计算药水瓶、装备、食物价格和各自属性的方法以及记录卖出的药水瓶、装备、食物的方法。
Main
主要进行了选择,以及创造新的药水瓶,装备、食物。
2、架构调整
我在完成这几次作业的过程中没有改动架构,基本上就是每次作业把新功能放在一个新的类中,比如完成第四次作业时加了Fight类,完成第七次作业时加了Store类。可能是oopre课程难度还不算太大,而且每次迭代要添加的功能比较集中,可以这样做。到了oo正课时,若是还不合理规划自己的架构就会带来一些问题。
我觉得我的架构有以下三3、点可以改进的地方:
建立工厂
最初由于创造药水瓶、装备、食物的过程较简单,我直接把创造部分的代码写到了Main类里。但是随着药水瓶、装备的种类的增多,Main类也变得越来越冗长。由于发现这个问题时已经是最后一次迭代,我就没有修改原有的架构。在学习了工厂模式后,我觉得可以提供一种统一的方式创建对象。创建BottleFactory,EquipmentFactory,FoodFactory三个类,实现创造三种物品的方法,再把它们统一接在Factory接口上。这样做的好处是可以降低对象之间的耦合性,并且使得系统更加灵活和可扩展。
减少重复代码
在完成作业的过程中,我发现三种物品的添加、移除、携带、使用的方法具有高度的相似性。之前我一直都是写好一个方法,复制粘贴,然后将名称改一改。然而这样做繁琐且容易出错。可以定义一个接口,将三种物品共同有的方法写在一起。这种方式使代码更加简洁和灵活,并提高代码的可读性和可维护性。
拆分过大的类
作业完成后,我发现我的Fight类有点长。可以将Fight类分成三个较小的类:FightLogSearcher 类:负责搜索战斗日志并打印匹配结果。FightLogPrinter 类:负责打印战斗日志的不同类型。FightLog 类:负责管理战斗日志,并提供搜索和打印的功能。通过将原先的大类拆分成多个小类,每个类都有其特定的职责和功能,代码变得更加模块化和可扩展。这样也更容易理解和维护每个类的代码。
3、Junit心得
最初我写Junit完全是为了Junit的分数。我感觉它没有太大意义,基本上就是把已有的代码又写了一遍。但是,随着代码越来越多,越来越复杂,我发现Junit确实可以帮我快速发现问题,特别是一时粗心大意犯下的马虎错误。比如又一次,我将CritEquipment计算体力减少量的方法写成了EpicEquipment计算体力减少量的方法,若不是有Junit,我大概要花很长时间才能找出这个错误。我认为自己应该深入学习Junit的写法,例如学习assert语句的用法,这样能够更快找出问题所在。
4、oopre心得
我目前还没有完全从面向过程的编程思维转化成面向对象的编程思维。比如我仍然会把很多方法都堆在一个类中,不知道如何将它们拆分到不同的类中。这可能是目前我比较需要提高的地方。
还有一点,学会自己测评。我感觉现在中测几乎测不出什么问题,哪怕是一些非常明显的问题,也要等强测时才能发现。听助教说,到了oo正课时,这种情况会更加严重。因此,学会自己测试是很有必要的。
如此看来,感觉自己要学的东西还有很多呢,看来寒假还是不能太放松。
最重要的一点,保持良好的心态。出bug是很正常的事情,而且我们要相信,绝大部分的bug都是我们能够找到的,尽管那可能需要几个小时。不要因为有bug就情绪崩溃,影响心情还算小事,这会让我们更难发现问题所在,或是在改掉一个bug的同时创造出许多新的bug。
5、建议
1、在前两节课时介绍一些Java的语法,并且大概介绍一下架构应该是怎样的。有部分同学可能和我一样,之前从没接触过Java,第一次写作业时完全不知道该如何下手,基本全是靠询问ChatGPT。
2、有没有可能提高一下这门课的学分?我觉得这门课的工作量实在是太大了,甚至超过了某些核心专业课,感觉是“一学分的课上出了十学分的效果”。