Command与Query分离
来源:互联网 发布:数组 reduce 编辑:程序博客网 时间:2024/06/02 07:58
原文:CommandQuerySeparation 设计 Bliki 索引
“Command与Query分离”这条术语首现于Bertrand Meyer的著作《面向对象软件构造(Object Oriented Software Construction)》,这本书是OO思想普及发展初期几本影响力最大的OO著作之一(说的是这本书的第一版,第二版也很好,不过你得先炼几个月臂力才能举起它来)。
“Command与Query分离”的基本思想是object的方法应该清晰明确地分为以下两种:
- Query:返回结果但不修改系统的可见状态(无副作用)。
- Command:修改系统的状态但无返回值。
Command与Query分离原则的实际价值在于,把修改状态的方法和不修改的明确地区分开将会带来巨大的便利:在许多情况下你可以非常有把握地使用Query,不必在意是什么地方,还可以调整多个Query的调用顺序,只需在用modifier时再小心谨慎。
该原则主张以返回类型来区分两种方法,这是一条不错的规约,大多数情况下都能达到效果。考虑Java遍历一个集合的惯用法:next方法既返回集合的下一项又让这个iterator前进一步。但我个人更喜欢将advance方法(前进)和current方法(取当前项)分开的风格。
Meyer愿意绝对遵守分离原则,但实际上存在例外情况,比如Stack的pop方法就是个好例子,既是个modifier又有返回值,对此 Meyer的说法恰如其分:你可以别定义这个方法,但这个惯用法确实有用。因此,我对分离原则的态度是可以遵守时就遵守,但类似pop那样的方法我不惮以违规来实现。
如果语言本身支持这种分离观念——试想一种语言能自己检测哪些方法修改状态,或至少允许程序员来标定——这该多好。之所以语言无法自动检测,是因为“不改变状态”这条规则只是针对系统的可见状态说的;程序员做标记看起来更合理些,可并不常见,我接触到的唯一实例是C++的const修饰词(译注1),但我已经多年不用C++了,所以很难评估它在实践中的效用,但我知道优秀的C++程序员对它乐此不疲。
译注1:C++还有一个mutable修饰词,mutable修饰的变量基本上对应于Martin说的非可见状态,标记为const的class成员函数如果修改非mutable成员变量会编译报错,但可以修改mutable变量,因此C++语言实现了“自动检测”。
- Command与Query分离
- Command与Query分离
- Command and Query Responsibility分离模式
- 团队遵守Command和Query分离的编码习惯能让后来者快速融入开发
- Command: Query port usage
- query.uniqueresult() 与 query.list
- CQRS(Command Query Responsibility Segration)
- command --help 与 help command
- Query.list() 与 Query.iterator() 区别
- hibernate-Query.list()与Query.iterate()比较
- term query与match query区别
- 笔记:delphi 与 Query
- 容器query与list
- 界面与代码分离
- 2000分离与附加
- 分离 需求与开发
- 美工与程序分离
- 分离与融合
- 跟我一起写 Makefile(一)
- 使用Xdebug调试和优化PHP程序[3]
- 跟我一起写 Makefile(九)
- JBoss Seam 手册
- 跟我一起写 Makefile(十四)
- Command与Query分离
- Silverlight权威讲座 - 新书序
- 跟我一起写 Makefile(七)
- Java规则引擎-Drools
- 使用Xdebug调试和优化PHP程序[2]
- 以程序的方式操纵NTFS的文件权限(中)
- 估计表的大小(一)
- 你应该知道的10件关于Java 6的事情
- 跟我一起写 Makefile(八)