309
社区成员
发帖
与我相关
我的任务
分享
设计了本次项目中最基础的几个类:Adventurer类、Equipment类、Bottle类、Spell类以及对应的子类。
本次作业学习了接口,这是C语言里没有的,一开始我对它的用途与存在意义不太了解,不过后来感觉或许这就是一个抽象类。按java中万物皆对象的视角看,接口像是一个定义了不同方法的类,而继承(实际上是implement)了该“类”的其他类需要实现(覆写)其中的方法。
本次迭代引入了Item接口是一个关键转折点,统一药水和法术的使用行为。通过此次作业,我对接口的用处与好处也逐渐了解。它从上层定义了子类需要的方法,这使得后续添加新类更加容易,使代码架构清晰了许多。
此次作业细化了装备。将装备抽象为Weapon和Armour基类,并派生出Sword和Magicbook。
引入了工厂模式,将对象创建逻辑与冒险者分离,不得不说,这使得我的Adventurer类代码可读性提高了不少,之前代码中有大量的case-switch语句,引入Factory后,一下清晰多了。也是让我意识到了java中的单一职责原则。
引入了复杂的上下级关系,应该是难度最大的一次作业了。不过构建雇佣关系图、判断上下级关系倒并不难,我遇到的主要问题是面对一些特殊指令时的输出次序。由于还引入了援助系统,那么可能一次血量的变动就会触发事件,这时触发援助时机的判断就需要考量,不然可能会影响到后续的输出。实际上我设置的援助判断时机是有点问题的,我因为不想重构太多代码,将其放在了setHitPoint中,这是不好的,应该重新写个血量变动判断的函数。因为这个也导致了一些波折,权当警醒吧,日后若要写项目,特别是团队项目,这些都是要注意的。
最后一次作业写了递归下降解析器,学习了一种新的算法,并将其运用到了项目中。
一句话,让我学会了写测试用例。如果不用JUnit的话要测试得运行一遍Mainclass,或者在每个类中都写一个main函数来调试,但JUnit使得针对某个特定类、特定方法的测试容易了许多,并且也让我养成了写完代码先测试一遍的习惯,也成功让我在一些边界情况(比如冒险者死亡状态下的行为约束、aid方法判断条件等)发现了一些漏洞,并加以修正。
此次项目让我体验了面向对象的一些方面。
与c语言关注"如何一步步实现功能"不同,java中提倡万物皆对象,每一个类都从属于Object这个基类,另外甚至有一些看上去不应该是类(我一开始觉得不会有这些类)的类,如Class,Method类等。随着课程深入,我也逐渐学会了从对象视角分析问题:每个对象应该承担什么职责、拥有哪些行为、与其他对象如何协作。
在这其中,封装是十分重要的思想,接口就是一种封装。他们使得使用者不需关注具体实现,只要拿来便可实现某种功能,这使得代码可读性大大提高。另外还有多态、继承,它们使得父类与子类的关系明确,并且既可以通过向上转型进行统一处理,也可通过向下转型进行特殊处理,操作类更加方便。后续添加新子类也不会破坏原有结构。
有些弱测会给测试用例,有些不会给,要是都给就好了。(虽然课程组应该想通过这个提升我们用junit来debug的能力)