270
社区成员
发帖
与我相关
我的任务
分享在第二次作业中,课程组提供了一种读取指令的方法,于是我沿用其思路,在main函数中建立一个Operator类,将指令按照输入规格划分成各个部分(如指令名称缩写、adv_id等),然后再分别对每种指令构建含有其对应参数的方法。不过相比而言,国庆期间的第四次作业中,课程组给出的示例代码中的读取指令的方法更为合理。
除了MainClass和Operator类,当然还要创建Adventurer、Bottle、Equipment、Spell等类。由于作业中对于各个单位的id有不允许重复的限制,因此我们可以利用HashMap容器来存储对象,其中的键值对关系可以让我们的添加、移除物品等操作更加直观和简洁地实现。
在迭代的过程中,为了能尽量不改变各类之间的联系方式,我在Operator类中创建了一个含有所有冒险者的容器,对于每条指令,都从容器中取出对应的冒险者,然后在Adventurer内部实现该指令需要的操作。Adventurer和Bottle、Equipment、Spell之间的联系也是类似的。这样可以在一定程度上避免不同类之间的交互带来的错误,在错误出现时也能较快地对其进行定位。
由于使用python等工具实现功能较完善且能一次处理大量指令的测评机需要复杂的逻辑,因此我们不妨先利用IDEA中自带的测试功能对我们的代码进行初步的错误筛查。在测试文件中,我们既可以生成一定数量的指令,也可以直接构造具有针对性的数据点,在同一个项目中关联源代码并利用Assert等方法进行结果对拍。这一点可以帮助我们用更低的成本快速排查一些比较明显的错误,从而在评测之前修复它们。不过需要注意的是,在构造数据的时候一定要确保其正确性和一定的针对性。比如在使用法术进行攻击并造成冒险者死亡的情况下,可以构建指令来验证冒险者死亡后与其有关的指令是否不再生效;另外,第六次作业中雇佣与冒险者援助机制不像前几次迭代的内容那样具象化,其中的关系网的维护容易出现漏洞,因此我们可以构建含有一定数量冒险者的数据,在其中添加或删除雇佣关系并模拟遭受攻击后进行冒险者援助的情形,验证其中的逻辑是否正确。
总而言之,JUnit单元测试可以让我们对代码进行快速、有针对性的检查,是帮助我们发现程序漏洞的有效手段。
在本课程的学习中,我们掌握了面向对象的一系列特征,包括继承、封装、多态等,还有各种容器、观察者模式、深浅克隆等工具和技巧。这让我们可以更加灵活地处理各个对象,也支持了更为复杂的开发工作。在不同的类中,我们可以封装不同的属性、方法等,处理对象间复杂的调用、继承等关系,方便进行迭代式开发和子功能的模块化开发与调试。除此之外,本课程还有助于我们养成良好的代码习惯和代码风格,并与同学交流、讨论更好的代码思路,形成良好的开发思维。
个人愚见,在指导书的“预备知识”章节的代码块中可以更多地插入一些注释辅助文字讲解,或在测验与实验与习题中更多地加入类似第七次作业的补全题目,这样有助于加深同学的理解。