补肾调理药材有哪些:Command与Query分离

来源:百度文库 编辑:九乡新闻网 时间:2024/05/04 07:11:19
原文:CommandQuerySeparation    设计            Bliki 索引

“Command与Query分离”这条术语首现于Bertrand Meyer的著作《面向对象软件构造(Object Oriented Software Construction)》,这本书是OO思想普及发展初期几本影响力最大的OO著作之一(说的是这本书的第一版,第二版也很好,不过你得先炼几个月臂力才能举起它来)。

“Command与Query分离”的基本思想是object的方法应该清晰明确地分为以下两种:
  •     Query:返回结果但不修改系统的可见状态(无副作用)。
  •     Command:修改系统的状态但无返回值。
“Command”这个词在别的上下文中也用得很广,所以我喜欢改用“modifier”,你还能见到另一个词“mutators”,说的都是这里的概念。

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++语言实现了“自动检测”。