看Craig Larman的书,
里面提到的这个原则.
请看下面两个函数:
// style #1; used in the official solution
public void roll()
{
faceValue = // random num generation
}
public int getFaceValue()
{
return faceValue;
}
为什么不是将两个方法合并, 使roll()方法返回新的faceValue呢? 如下所示:
// style #2; why is this poor?
public int roll()
{
faceValue = // random num generation
return faceValue;
}
你可以发现大量使用风格2的代码的例子, 但这种方法并不合适, 因为它违反了
命令-查询分离原则(Command-Query Separation Principle). CQS是针对方法的经典OO设计原则. 该原则指出, 任何方法都可能是如下情况之一:
1. 执行动作(更新,调整...)的命令方法, 这种方法通常具有改变对象状态等副作用, 并且是void的.
2. 向调用者返回数据的查询, 这种方法没有副作用, 不会永久性的改变任何对象的状态.
关键是,
一个方法不应该同时属于以上两种类型.
CQS被公认为计算机科学理论中具有价值的原则. 因为遵守该原则, 你能够更容易的推测出程序的状态, 在查询状态时不会同时发生变更. 这样使得设计更便于理解和预见. 例如, 如果一致遵循CQS, 那么你还知道查询或者getter方法不会作出任何更改, 而命令也不会有任何返回. 这是个简单的模式.
这通常是要严格遵循的, 因为如果突然采用其它方法, 将会产生令人不快的意外, 从而违反了OOD中的
最小意外(Least Surprise) 原则.
<from Aply UML & patterns>
以上是原文, 昨晚上看书时才看到的, 回想起来以前真的好多次违反这个原则,
但不确定这个原则是否所有情况都适用,
大家怎么看CQS的, 我本来想找出例外情况的, 但一时还没想出例子来, 一起讨论下吧.
--------------
好像清楚一点了, CQS更像准则, 而不是"原则",
会有例外情况出现的, 比如jdk中:
// FileInputStream
public native int read() throws IOException;
// Vector
public synchronized boolean add(E e)
// HashMap
public V put(K key, V value)
看来学习OOD理论不能太死板,呵呵
分享到:
相关推荐
COSEL科索 CQS48018-50模块电源产品说明书pdf,COSEL科索 CQS48018-50模块电源产品说明书
gcvhgvmjbjbjhbjbjhbhjhhhhhhhhvhxcfzztfujhljkjfdgfsdzfxcvjknvchxfzdSZf
Spring CQS 库 spring-boot-started 库允许轻松遵循 如何使用 命令 通过实现 Command 接口创建 Command public class ExampleCommand implements Command { private final String textToLog; // constructor/...
该架构旨在以结构化、干净、可靠的方式拥有尽可能多的共享代码——使用 CQS(命令查询分离)。 我想通过以下方式促进稳定且与平台无关的开发: 干净和可靠的代码没有比需要的更复杂 DDD , 专注于领域和业务 可...
Color quality scale(CQS色质指数计算公式文献).pdf
Labview制作的软件安装包,下载附件安装即可,安装完后,导入光谱数据(附件包含光谱数据范例excel),即可算出色质指数CQS,粉丝免费下载,该软件已经经各大高校研究机构验证过,放心使用,0积分下载
介绍CQS与CRI的计算原理,以及二者的对比,描述详细易懂
显色指数CRI与色质指数CQS
CQS 15种色样对应的光谱数据,380nm~830nm间隔5nm的色样光谱数据,想要计算CQS的软件工具,请看我另外一个资源:https://download.csdn.net/download/wanghuannihao1992/15684739
从 CQS 到 CQRS1
CQS 是一个消息队列系统,使用 Apache CouchDB。 它与完全一样。 API 是一样的。 一切都完全一样,它只是在 CouchDB 上运行。 CQS 在 Javascript 中实现并支持: 节点 谷歌浏览器 12 火狐 3.5、火狐 3.6、火狐 4 ...
Java 9中的实体设计原则 SOLID是由Robert C. Martin开发的重要编程实践的集合。 SOLID包含5种编码实践: SRP-单一责任原则OCP-打开/关闭原理LSP-Liskov替代原理ISP-接口隔离原则DIP-依赖倒置原则SRP-单一责任原则SRP...
关于 当前版本:Zienaps 2021 年 7 月 11 日的 v1.2.3 如何使用这些功能
java代码-04cqs
描述 命令查询分离(CQS)原理 CQS原理将对象的方法分为两个明显分开的类别: 命令:更改系统状态,但没有返回值。 查询:请勿更改系统状态,但它具有返回值(无副作用)。
snow [ -CQS ] [ -p passwd ] [ -l line-len ] [ -f file | -m message ] [ infile [ outfile ]] OPTIONS -Q Quiet mode. If not set, the program reports statistics such as compression percenta
最新联行号查询明细表---最新联行号查询明细表,约15w条
cqs982a39a.gaURMo6
cqshi最新写锁工具,支持最新588驱动,全面支持广材网,亲试可用
坦率的 一个简单的可访问的CQS / CQRS库集。 目标: 以简单明了的方式说明CQS / CQRS的用法,即使对于初学者也是如此 提供人们可以直接使用或可以很容易地修改以供自己使用的...指导原则: 没有隐藏的魔法,没有怪