149
社区成员
发帖
与我相关
我的任务
分享在经过一系列的迭代和调整后,本人的作业最终的架构设计为:

下面我将结合这张IDEA自动生成的关系图来详细讲解我的最终架构。
物品系统:
Item:所有物品的接口,定义了所有物品的共同行为,Equipment和Bottle都实现了这个接口
Equipment:装备类,定义了装备所具有的共同属性和共同行为
Weapon:武器类,继承自Equipment
Sword:剑,继承自Weapon
Magicbook:魔法书,继承自Weapon
Armour:装甲类,继承自Equipment
Bottle:药水类,定义了药水所具备的共同属性和共同行为
DefBottle
ManaBottle
AtkBottle
HpBottle
法术系统:
Spell:法术类,定义了所有法术的共同属性和行为
HealSpell
AttackSpell
角色系统:
Adventurer:冒险者类,实现了Employer和Employee两个接口,表明一个冒险者既可以是别人的雇主,也可以是别人的雇员
基础模块:
MainClass:处理输入,将输入处理为数组并传入Games启动游戏
Games:核心模块,根据处理后的输入依次处理指令,并执行相关操作
Factory:工厂类,用于创建所需的Item
Lexer:词法分析类,用于处理lr指令中操作
程序的入口在MainClass类中,通过该类启动程序并输入操作指令,然后通过核心模块Games处理输入,调用方法,实现游戏功能。
第一次迭代
此次迭代是在原有基础上为冒险者增加一些属性,并新增背包系统,丰富药水瓶的种类。因此,在这次迭代中引入了继承机制,便于对药水的管理。而对于背包系统,我则是选择在物品属性中新增Usable并添加相关管理方法,这也为后期的大重构埋下了伏笔。
第二次迭代
这次迭代加入了战斗机制,丰富了装备种类,并对背包系统进行了完善。其中,加入战斗机制只需要添加相应的方法即可,丰富装备种类也只是继承,而完善背包系统却导致了整个代码的大重构,其中很大的原因是由于第一次迭代的偷懒。这次迭代的重构我将原来用于存储所有冒险者的ArrayList容器改成了HashMap,同时在冒险者类中加入了完整的背包系统,其中的药水栏借助队列Queue实现。但在这次重构中,由于我的疏忽,并未对背包实现完整的管理,导致程序出现bug,没有通过强测。
第三次迭代
第三次迭代要求加入雇佣关系和相关限制,并引入了观察者模式。在引入雇佣关系限制的时候,最关键的一点在于异常指令判断与雇佣关系限制判断的优先级。引入的观察者模式则可以非常自然的实现救援这一过程。
第四次迭代
这次迭代只新增了lr指令,但是我们需要使用递归下降的思想来实现指令的正则化处理。在这次迭代中,我选择使用递归来实现多重关系的导入。
使用JUnit的目的是来测试我们自己编写的代码功能是否正常,而作业中对JUnit有着覆盖率的要求,这在很大程度上促使我们去更加全面的测试自己的代码。一方面,方法覆盖率需要我们尽可能的将所有的方法都覆盖,也就是说我们要尽可能全面的测试所有类型的指令;另一方面,分支覆盖率提醒我们要考虑到每一条指令的多种情况,这在很大程度上帮我测出了一些潜在的bug。在写JUnit测试的过程中,我也体会到,通过测试顶层的方法,它能够调用下层方法并覆盖,因此在写测试时,我们应优先测试顶层方法,然后再逐步完善测试未被覆盖的方法。同时,在编写JUnit代码中的一次重复度较高的部分,我尝试利用C语言程序简单实现了测试指令自动化转测试代码,这在一定程度上加快了我的JUnit代码的编写。
学习OOPre的过程并没有想象中的那么难,其关键在于编程思想的转变。之前面向过程编程侧重于算法和步骤,基本单位是函数,而面向过程编程则侧重于数据和关系,基本单位是类,这一转变让我能更好的专注于程序的功能,而不是它是怎么实现的,通过类的封装,我们只要把那些方法当成黑箱即可。
同时,面向对象里的继承机制极大的方便了对于不同对象的处理,也更能清晰的展示不同对象之间的关系。在学习OOPre的过程中,我们也学习了一些模式如工厂模式、观察者模式等,这些不同的模式有着各自擅长处理的方法和使用场景,通过选用合适的模式,我们的程序逻辑可以更加清晰,功能也不容易出错。除此之外,面向对象的编程模式让我们更加方便添加新的功能和方法,这是因为面向对象是抽象建模的过程,在添加新功能迭代的时候,我们可以直接按照人的思维来实现。
在编写作业程序时,我们封装了多个类,每个类各行其职,代码的整体逻辑十分明了。在编写核心程序的过程就像是搭积木,把其他类的方法按照逻辑依次调用,“拼装”成我们想要的程序。还让我感触很深的一点就是,对于之前从未接触过的Java语言,上手竟然如此容易,这也验证编程的关键不在于编程语言,而在于编程的思维。而且,借助编译器自带的代码提示工具,我们上手一门陌生编程语言的门槛越来越低。
建议在Pre课程开始前提供一点Pre的Pre,比如简单Java程序设计,帮助大家提前适应Java编程。
建议JUnit的教程可以再详细一点