知识卡片
告知不要询问
内容
调用方不应取出对象状态再替对象决策,而应告诉对象完成职责。这样能保护封装,减少状态泄漏和重复逻辑。发散:对象协作的关键不是“我知道你有什么”,而是“我信任你能做什么”。
参考来源
- 位置:第6章《敏捷编码》"31 告知,不要询问"(源文件:_epub-src/OEBPS/text00000.html)
- 结论依据:原文引用Alec Sharp"面向过程的代码取得信息,然后做出决策。面向对象的代码让别的对象去做事情",并用"送报男孩不能自己翻客户钱包拿钱,只能告知客户付两美元"的类比说明调用者不该基于被调用对象状态做决策,直接支持卡片结论。
- 原始内容:"面向过程的代码取得信息,然后做出决策。面向对象的代码让别的对象去做事情。……作为某段代码的调用者,开发人员绝对不应该基于被调用对象的状态来做出任何决策,更不能去改变该对象的状态。这样的逻辑应该是被调用对象的责任,而不是你的。在该对象之外替它做决策,就违反了它的封装原则……告知,不要询问。不要抢别的对象或是组件的工作。告诉它做什么,然后盯着你自己的职责就好了。"