`
iwindyforest
  • 浏览: 235112 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

讨论一下CQS (命令-查询 分离)原则

阅读更多
看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是一款单输出的模块电源,主要应用于工业电源、医疗设备、交通控制和其他对电源性能要求较高的领域。它具备高度可靠的性能,广泛的输入电压范围,并且输出电压和电流可以根据不同应用需求进行...

    从 CQS 到 CQRS1

    【CQS(命令查询分离)】 CQS(Command Query Separation)是软件设计原则之一,最早由Bertrand Meyer在其1988年的著作《Object Oriented Software Construction》中提出。这一原则主张将数据的查询操作(Query)与...

    V-CQS-2L-5P-PCB1_HIV_

    gcvhgvmjbjbjhbjbjhbhjhhhhhhhhvhxcfzztfujhljkjfdgfsdzfxcvjknvchxfzdSZf

    cqs-spring-boot-starter

    Spring CQS 库 spring-boot-started 库允许轻松遵循 如何使用 命令 通过实现 Command 接口创建 Command public class ExampleCommand implements Command { private final String textToLog; // constructor/...

    Color quality scale(CQS色质指数计算公式文献).pdf

    "Color Quality Scale (CQS) 色质指数计算公式文献" _color quality scale(CQS)是对传统的color rendering index(CRI)的改进和扩展,旨在解决CRI在应用于白光LED light sources时存在的一些缺陷。CQS使用了更...

    Samples.Cqs:面向 .NET 和跨平台 Xamarin 应用程序的基于 SOLID CQS 的参考架构

    该架构旨在以结构化、干净、可靠的方式拥有尽可能多的共享代码——使用 CQS(命令查询分离)。 我想通过以下方式促进稳定且与平台无关的开发: 干净和可靠的代码没有比需要的更复杂 DDD , 专注于领域和业务 可...

    CQS显色指数的原理介绍

    ### CQS显色指数原理详解 #### 一、引言 色彩再现,即照明光源对物体颜色外观的影响,可以通过与参考光源下物体的颜色外观进行有意识或无意识的比较来评估。国际照明委员会(CIE)定义了色彩再现的概念,并提出了...

    色质指数(CQS)计算软件 color quality scale

    Labview制作的软件安装包,下载附件安装即可,安装完后,导入光谱数据(附件包含光谱数据范例excel),即可算出色质指数CQS,粉丝免费下载,该软件已经经各大高校研究机构验证过,放心使用,0积分下载

    cqs-uteis2:一些有用的工具

    标题 "cqs-uteis2" 提供的信息表明这是一个包含一系列有用工具的资源包,而“一些有用的工具”可能指的是各种编程或Web开发辅助工具。描述中提到的“Zienaps 2021 年 7 月 11 日的 v1.2.3”是指这个工具包或者某个...

    显色指数CRI与色质指数CQS

    ### 显色指数CRI与色质指数CQS:深入解析与应用 #### 显色指数CRI:定义与局限性 显色指数(Color Rendering Index,简称CRI)是评估光源再现物体真实颜色能力的一个指标。CRI值越高,表示光源在照射物体时,物体...

    一些软件设计的原则一些软件设计的原则

    CQS原则主张命令和查询操作应分开。查询操作不改变对象状态,而命令操作则执行修改。遵循这一原则,可以确保查询方法没有副作用,同时保持命令的明确性。在实际应用中,根据需求平衡清晰性和便利性,可能需要适度...

    CQS色样光谱数据.xlsx

    CQS 15种色样对应的光谱数据,380nm~830nm间隔5nm的色样光谱数据,想要计算CQS的软件工具,请看我另外一个资源:https://download.csdn.net/download/wanghuannihao1992/15684739

    请求:用于CQS原理的NuGet软件包

    命令查询分离(CQS,Command Query Separation)是软件设计原则之一,由温瑟·雷斯(Ward Cunningham)提出,其主要目标是提高代码的可读性和可维护性。CQS强调将对象的方法分为两类:命令(Commands)和查询...

    cqs:CouchDB 队列服务

    CQS 是一个消息队列系统,使用 Apache CouchDB。 它与完全一样。 API 是一样的。 一切都完全一样,它只是在 CouchDB 上运行。 CQS 在 Javascript 中实现并支持: 节点 谷歌浏览器 12 火狐 3.5、火狐 3.6、火狐 4 ...

    Solid-Design-Principles-in-Java:SOLID设计原则及其在Java 9中的实现

    Java 9中的实体设计原则 SOLID是由Robert C. Martin开发的重要编程实践的集合。 SOLID包含5种编码实践: SRP-单一责任原则OCP-打开/关闭原理LSP-Liskov替代原理ISP-接口隔离原则DIP-依赖倒置原则SRP-单一责任原则SRP...

    IT技术讲座英文课件2-Software Design

    其中,命令查询分离(Command-Query Separation, CQS)原则是一个关键的设计原则,由Bertrand Meyer提出。CQS原则主张,查询操作(query)应该没有副作用,即它们不应改变系统状态,而只是获取信息;另一方面,修改...

    ddd-cqrs-base-project:自动从code.google.compddd-cqrs-base-project导出

    《ddd-cqrs-base-project:基于Java的领域驱动设计与命令查询职责分离实践》 ddd-cqrs-base-project是一个基于Java的开源项目,其主要目标是实现领域驱动设计(Domain-Driven Design,简称DDD)与命令查询职责分离...

    java代码-04cqs

    在给定的“java代码-04cqs”压缩包中,我们有两个文件:main.java 和 README.txt。这个压缩包显然包含了一个简单的Java项目或示例。以下是对这两个文件及其可能包含的知识点的详细说明: 1. **Java编程语言**: ...

    ctf misc 杂项 snow隐写加解密

    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

    (20200419)influxdb基础常用命令

    在本文中,我们将深入探讨InfluxDB的一些基础常用命令,包括用户管理、数据库操作、数据插入与查询、连续查询以及数据保留策略。 1. **用户管理**: - **创建用户**:你可以使用 `CREATE USER` 命令创建新的用户,...

Global site tag (gtag.js) - Google Analytics