271
社区成员
发帖
与我相关
我的任务
分享以下是在IDEA中生成的架构设计图。

Main类:用来进行输入操作,识别每一条指令并根据指令内容调用对应的方法。Adventure类:冒险者类,里面包含实现各种指令的方法。Bottle,Magic,Equipment及其子类:分别用来实现作业中的药水瓶、魔法以及装备系统,采用继承的方式来细分其子类。Factory类:工厂设计模式的应用,用来进行各种对象的实例化。Parse,Lexer类:用来实现lr指令的词法解析和语法解析。在第一次迭代作业中,我构建了Adventure、Equipment和Bottle 类,其属性均为private类型,其他类只有通过其内部定义的方法才能访问其属性,体现了面向对象编程中封装的基本特征。实现了添加冒险者,为冒险者添加瓶子、装备等最基本的指令。这次作业让我熟悉了Java的基本语法,学会了ArrayList的使用,为后续的迭代作业打下基础。
在第二次迭代作业中,我应用了继承与接口的相关知识,并引入了背包系统。
对于HpBottle,AtkBottle,DefBottle,ManaBottle这四个类,它们都具有Id、effect等属性,因此让他们都继承自Bottle这一父类,从而减少了代码的重复。同时,由于这四个子类具有不同的种类,因此需要重写父类中的getType()方法,这对应了面向对象编程中 多态 这一基本特征。
对于Bottle和Spell,因为他们都能够对指定冒险者进行使用操作,因此我在这次作业中定义了Usable接口,并规定了apply()方法,这一在处理use指令时就无需再用if-else将Bottle和Spell分开讨论,而是直接使用Usable中的apply方法。
在第三次迭代作业中,我学习了设计模式的相关知识并将工厂模式应用到本次作业中。当我们要实例化一个Bottle、Magic或equipment中的一个对象时,我们不必再根据Type来书写冗长的if-else或switch语句,而是定义一个Factory类,将所有对象的实例化都交给Factory来实现,从而大大减少了代码的长度。
在第四次迭代作业中我们引进了了雇佣与援助系统。
对于雇佣系统,可以通过为Adventure类添加employeeList以及Boss属性来实现。同时,定义findAlly方法来判断指定冒险者是否为自己的盟友,从而决定use和fight是否被执行。
对于援助系统,我应用了观察者模式的思想。当冒险者血量发生危险变化时(0 < 新血量 ≤ 原血量 / 2),其所有下级会自动尝试进行治疗。这体现了对象状态变化自动触发相关对象行为的观察者模式理念。
第五次迭代作业中我学习了递归下降的思想并基于此实现了lr指令。先构建Lexer类来进行词法分析,将输入转化为一个个token。再构建Parse类来进行语法分析,分别用ParseAdventure和ParseEmploy解析标识符和被雇佣者。
使用JUnit测试能够帮助我们验证已经完成的代码是否能够实现预期的功能,并且当我们对代码进行修改或增加新的功能时,JUNit测试能够帮助我们自动测试新的修改是否会破坏已有的设计。
在编写JUnit测试时,如果要写的测试数据很多,最好每写完一部分便写上对应的注释。例如在作业中的fight指令需要覆盖攻击力高于总体防御、低于总体防御以及魔力值不够等多种情况,最好每进行一次操作后便在注释中写上涉及到的冒险者的状态,不然当测试数据多起来时很容易会绕晕。
我在OOpre课程中最大的收获便是实现了从面向过程到面向对象的思维转变。让我从关注一个问题该如何解决转变到了以对象为核心来思考问题,重点关注“谁做什么”。在一次次作业中,我不仅仅熟悉了java这门编程语言,还深刻体会到了面向对象的封装、继承、多态这三大特征。此外,在作业的提交过程中,我还学会了如何使用git工具来对自己的代码进行版本管理。
OOpre中的五次迭代作业让我意识到了让代码保持良好的风格与可读性的重要性。只有在一次作业中时时刻刻都注重代码书写的规范性,才能够为下一次迭代打下基础,否则错误会越堆越多,让之后的作业变得更加困难。
在只有C语言基础的情况下要同时学习Java语言、面向对象思想以及git等工具的使用,压力较大,建议在大一暑假可以提前发放一些预习资料来过渡一下。