270
社区成员
发帖
与我相关
我的任务
分享
记得刚开始做第一次作业时,看着题目要求实现冒险者、药水瓶和装备这几个类,心里还挺有把握的。毕竟在C语言里,这就是几个结构体的事情。但真正开始写代码时才发现,面向对象的要求完全不同。
最开始的设计很简单,就是三个类加上一些管理容器。但到了第二次作业,要加入背包系统和各种状态属性时,我才意识到最初的设计考虑得不够长远。那些天我经常在宿舍和同学讨论:这个属性应该放在哪里?这个方法由哪个类来负责?
第三次作业要求细化装备系统,这时候之前建立的工厂模式终于显现出价值。虽然刚开始写Factory类时觉得多此一举,但当看到创建装备的代码变得如此简洁时,我才真正理解了设计模式的意义。
第四次作业的雇佣关系是最让我头疼的部分。为了理清那些上下级关系,我在纸上画了很多示意图。最后决定单独写一个RelationManager类来处理这些复杂的关系,这个决定在后续开发中被证明是正确的。
最终代码形成了清晰的三层架构:
数据层(模型层)
Adventurer:核心数据模型,管理冒险者所有状态
物品体系:Item接口 → Bottle/Equipment → 具体子类
法术体系:Spell抽象类 → HealSpell/AttackSpell
逻辑层(控制层)
World:全局业务逻辑控制器
RelationManager:专门处理雇佣关系逻辑
Factory:负责对象创建
表示层
Main:处理输入输出,调用业务逻辑
刚开始要求写JUnit测试时,我内心是抗拒的。觉得又要多写代码,而且看起来都是在重复验证一些显而易见的功能。
但有一次,我修改了一个看似无关的方法,结果导致战斗计算出错。如果不是之前写的测试用例及时发现问题,我可能要花很长时间才能找到这个bug。从那以后,我开始认真对待测试。
慢慢地,我发现写测试其实是在帮助自己理清思路。如果一个方法很难写测试,通常意味着它的设计有问题。要么职责太多,要么依赖太复杂。通过写测试,我反而改进了一些原本不太合理的设计。
作为一个之前主要写C语言的学生,转向面向对象的过程并不轻松。
在C语言里,我习惯先定义数据结构,再写操作这些结构的函数。但在Java中,我需要从一开始就思考:这个对象应该有什么属性?它能做什么事情?
记得在实现冒险者的战斗方法时,我最初的想法是写一个独立的战斗函数。但经过思考后,还是决定让冒险者自己来执行攻击动作。这种“让对象自己做事”的思维方式,是这门课给我最大的收获之一。
另一个重要的转变是关于代码复用的认识。在C语言里,复用通常意味着复制粘贴然后修改。但在面向对象中,通过继承和多态,我们可以在不修改原有代码的情况下扩展功能。第三次作业中各种药水瓶的实现,让我真切体会到了这种优势。
经过这一学期的学习,我觉得如果能在课程中间安排一些代码review的环节会很有帮助。有时候自己写代码形成了固定思维,很难发现设计上的问题。如果能有老师或助教在关键节点给予指导,可能会学得更快。
另外,虽然课程文档对每次作业的要求写得很详细,但对于一些比较好的过去完成的作业的展示及讲解相对较少。如果能提供更多关于“为什么要这样设计”的说明,可能会帮助我们更好地理解面向对象的精髓。
总的来说,这门课让我对编程有了新的认识。从最初对面向对象的一知半解,到现在能够有意识地去思考类的设计和对象之间的关系。相信这些经历会对后续的面向对象课程有所帮助。