242
社区成员




Main作为程序入口,HandleSelection类通过实现Action接口处理字符串输入
Manage类管理Adventurer,实现对冒险者的添加和获取。
RegularBottle,ReinforcedBottle等Bottle类型继承父类Bottle,不同类型的Equipment同理。
FightLog用于处理与战斗模式相关的指令,ParseFightLog用于处理相关的输出减少FightLog中代码行数和长度,RegexMatch用于实现正则匹配
Aid类实现援助功能,Shop类实现商店功能,Commodity用于处理和价值相关的操作。
冒险者通过以下容器实现对物品的"拥有"和对冒险者的雇佣,FightLog中内容的是该冒险者作为被攻击者时记录的内容。
在完成第二次和第三次作业的时候,由于贪图查找时的快捷我选择使用HashMap来实现对物品的"拥有"。
我声明了一个Backpack类并在其中实现对物品的使用,还在Backpack中用了一个Inventory类来实现背包对不同物品的携带。
而用于装入Equipment,Bottle,Food的Inventory类也是通过HashMap实现的。由于当时还没有了解到“接口”,我让Food,Equipment,Bottle这本并不相似的东西成为了Item的子类,虽然这在逻辑上比较合理,但为了符合“按放入顺序”的要求,我需要设置多个HashMap以达到目的。这让代码变得比较复杂,甚至我自己在几天没看代码后都难以读懂程序,于是我便不得不重构了。
重构时,有了之前的惨痛教训,我所想要的是得到比较易懂的代码和尽快完成目标,于是我直接使用在Adventurer类里用Arraylist作为冒险者的背包。当冒险者拥有一件东西时,根据这个东西的类型加入bottles, foods, equipments。而尝试携带时根据类型加入对应的backpack。尽管这样的实现方式并不优美:我需要在通过根据不同的指令实现addFood,addBottle,addEquipment的功能而非通过一个addItem来实现冒险者对物品的拥有,删除背包中的物品时也需要注意在两个Arraylist里同时删除。但这对于当时的我却是一个最容易想到和实现的方式。
在完成hw4时,我的主程序入口是直接将读取的字符串分发到Adventurer类进行处理,例如:
这样在实际上非常不符合程序员调用函数的直觉,但是由于之前的任务对物品的使用修改比较少,所以这个问题没有暴露。而在后面的迭代中我又重写了这些方法,让它们可以直接通过ID或者name实现对物品的使用修改。
一开始接触Junit时我还是比较认真地根据教程写测试的,但是在hw3中由于本身代码逻辑比较复杂,无论我怎么写测试都没有达到junit测试的要求。在重构后的hw4,测试样例需要从头写起,而且能否达到覆盖率还是个未知数,于是我向同学询问后获知了可以使用重定向利用样例测试的方法并在后续迭代中使用。
由于课程任务是一次次迭代的,所以在一开始选择架构的时候一定要特别小心。我一开始是因为贪图HashMap查找时的快捷,不愿意遍历一个个Arraylist选择了HashMap,但是结果比较悲剧。因此在后续迭代过程中我的原则是用代码量来换取功能的实现和代码的易懂,虽然有些方法看起来比较傻且不优美,但是至少这是一种可以实现,易懂的方法,应当先尝试这种方法,至少可以先完成任务。同时也要注意减少冗余类的声明和谨慎选择容器,避免带来阅读和理解的困难。
希望指导书可以列出提交前,中,后的要点以便同学快速上手。第一次使用平台提交的时候对代码风格,提交过程,bug修改的流程都不太熟悉,花了较多时间来理解所给的文档。
希望可以增加对架构设计的帮助,例如更加鼓励在讨论区讨论代码架构,或者根据往年课设给出一些优秀代码以便同学在oopre第一次上手java的时候对java项目有一个基本概念。