理解“告诉,不要问”原则
内容提要
“告诉,不要问”是面向对象编程(OOP)的核心原则,强调从对象请求动作而不是直接查询其状态。通过封装对象状态和减少耦合,这一原则提高了可维护性和可重用性。在游戏开发中,这一原则通过一个玩家类的例子得以体现,该类请求攻击而不查询武器的状态。遵循这一原则可以增强封装性,减少耦合,提高可维护性,简化代码,并有助于更好的软件设计。然而,重要的是要灵活应用这一原则,考虑代码的清晰性和可读性。
延伸解读
原则的核心:从“询问状态”转向“请求动作”
“告诉,不要问”原则要求对象之间通过请求动作来交互,而不是直接查询对方的状态。例如,玩家类不应检查武器的弹药数量,而应直接请求武器开火。这样,武器的内部状态被封装起来,外部对象无需了解其细节。这种转变减少了对象间的依赖,使代码更易于维护和重用。
游戏开发示例:错误与正确做法的对比
在游戏开发中,错误做法是玩家类先检查武器的弹药状态再决定是否攻击,这增加了耦合且破坏了封装。正确做法是玩家类直接调用武器的开火方法,由武器类内部管理弹药状态并决定是否开火。通过对比可见,遵循原则能简化代码,避免复杂的状态检查,同时提升封装性和可维护性。
灵活应用:避免僵化,兼顾代码清晰性
马丁·福勒强调,应用“告诉,不要问”原则时不应过于僵化。有时直接检查对象状态并做出简单决策可能更清晰易懂。因此,在考虑封装和耦合的同时,必须权衡代码的可读性和可维护性。根据具体情境灵活运用,才能发挥该原则的最大价值。
Q&A
什么是‘告诉,不要问’原则?
‘告诉,不要问’原则是面向对象编程的核心原则,强调对象之间应请求动作而非直接查询状态。
遵循‘告诉,不要问’原则有什么好处?
遵循该原则可以提高对象的封装性,减少耦合,从而提升可维护性和可重用性。
在游戏开发中如何应用‘告诉,不要问’原则?
在游戏开发中,玩家类应请求攻击而不是查询武器的状态,以减少类之间的耦合。
错误的做法是什么?
错误的做法是玩家类检查武器的弹药状态,这增加了耦合并破坏了封装性。
如何正确地遵循‘告诉,不要问’原则?
正确的做法是玩家类直接请求武器执行攻击,武器类内部管理自己的状态。
马丁·福勒对‘告诉,不要问’原则有什么看法?
马丁·福勒强调在应用该原则时要保持代码的清晰性和可读性,避免过于僵化的应用。