知识卡片
命令查询分离用编码约定换取引用透明
内容
把类的操作严格分成两类——命令只修改状态、不返回结果,查询只返回信息、不修改状态——能让查询天然满足引用透明:同一个查询连续调用两次结果必然相同,就像数学里f(a)恒等于f(a),写代码和读代码的人都不用担心调用顺序会影响其他调用的结果。这条规则的价值在于,它不需要像纯函数式语言那样引入monad去人工模拟状态,只靠一条方法论式的编码约定就换回了引用透明的核心好处。
参考来源
- 位置:《架构之美》第13章《软件架构:面向对象与面向函数》13.3.5节《状态调停》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0261.xhtml)
- 结论依据:原文明确"命令-查询分离原则……类的特性(操作)可以清晰地分成两类:一类是命令……另一类是查询……命令不会返回结果;查询不会改变状态,换句话说,它们满足引用透明原则",并指出这是"方法性规则,而非语言本身的特性"。
- 原始内容:命令不会返回结果;查询不会改变状态,换句话说,它们满足引用透明原则……不管是哪里提到的,不管是出于理论还是实践的角度,命令-查询分离原则都是一种方法性规则,而非语言本身的特性,但所有慎重的Eiffel软件开发过程中都会遵从这一原则,以获得引用透明的优点。