”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 命令查询分离(CQS):更好的软件设计指南

命令查询分离(CQS):更好的软件设计指南

发布于2025-03-23
浏览:842

命令查询分离(CQS)是软件设计的基本原理,可在代码库中促进清晰度和简单性。由贝特兰·迈耶(Bertrand Meyer)创造的原则指出,系统中的每种方法都应执行操作(命令)或返回数据(查询),但绝不同时执行。这种区别可确保您的代码更易于理解,测试和维护。

在此博客文章中,我们将探讨CQ的关键方面,如何实施它以及它带来的软件开发带来的好处。我们还将提供在实用场景中应用CQ的示例,例如API设计和数据库交互。 [2

的核心,CQS将函数分为两个不同的类别:

命令:执行更改系统状态但没有返回值的操作(例如,更新数据库或发送电子邮件)。

在不更改系统状态的情况下检索数据(例如,从数据库中获取用户详细信息)。

这种分离简化了有关代码的推理,并避免了意外的副作用。

2️⃣

使用CQS 的好处 改进的代码可读性:命令和查询之间的明确区别使代码更易于理解。 减少副作用:查询不会修改状态,确保可预测的行为。 更轻松的测试:可以独立测试命令和查询,从而降低了测试用例的复杂性。 可扩展设计:鼓励模块化和脱钩代码,使系统更易于扩展和扩展。 [2

让我们将CQS原理应用于Express.js应用程序:

?没有CQS:

app.post('/user',(req,res)=> { const user = createuser(req.body); // 命令 res.json(用户); // 询问 });

?使用CQS:
app.post('/user',(req,res)=> { CreateUser(req.body); // 命令 res.sendstatus(201); }); app.get('/user/:id',(req,res)=> { const user = getuser(req.params.id); // 询问 res.json(用户); });

在这里,命令(createuser)和查询(getuser)分开,使每个函数的职责更加清晰。
[2

与旧代码集成:

在现有代码库中采用CQS可能需要重构。启动小,专注于新功能或关键组件。 严格遵守CQS有时会导致其他功能调用。选择性优化以平衡清晰度和性能。

结论

命令查询分离是一个简单而强大的原则,它促进了软件设计中的清晰度和可维护性。通过采用这种方法,您可以创建更易于推理,扩展和测试的系统。无论您是设计API,实现域逻辑还是管理数据库交互,CQS都是现代软件工程的宝贵工具。 [2


版本声明 本文转载于:https://dev.to/wallacefreitas/command-query-separation-cqs-a-guide-to-better-software-design-2jab?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在全高布局中有效地将Flexbox和垂直滚动结合在一起?
    如何在全高布局中有效地将Flexbox和垂直滚动结合在一起?
    在全高布局中集成flexbox和垂直滚动传统flexbox方法(旧属性)使用新的FlexBox properties 试图将全新的FlexBox属性应用于全高和可滚动的设计引入限制。使用高度的解决方法:0px;包装器上的元素是不可靠的,并创建了其他问题。一个鲁棒的解决方案涉及为需要垂直滚动的特定高...
    编程 发布于2025-03-24
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-03-24
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-03-24
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-03-24
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-03-24
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-03-24
  • 如何使用提交和取消选项实现JavaScript表单提交确认对话框?
    如何使用提交和取消选项实现JavaScript表单提交确认对话框?
    javascript表单提交:使用提交和取消选项的确认对话框 使用Inline JavaScript确认对话框实现与Option cormist cormbs inscriond对话框,以提交或取消确认对话。 This dialog displays a pop-up message promp...
    编程 发布于2025-03-24
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-24
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-03-24
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-03-24
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-03-24
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-03-24
  • \“ margin:0 auto; \”如何中心CSS中的元素?
    \“ margin:0 auto; \”如何中心CSS中的元素?
    在“ margin:0 auto;”中了解自动在CSS属性“ margin:0 auto;”中的作用,即在CSS属性:0 auto;“”中,值“自动”具有至关重要的意义。当应用于第二个参数(即水平边缘(左右))时,它指示浏览器自动计算这些边缘的宽度以实现特定的对齐效果。以说明其功能,请考虑以下示例...
    编程 发布于2025-03-24
  • 子Queries vs. Joins:为什么要用连接结果替换100倍的性能改进?
    子Queries vs. Joins:为什么要用连接结果替换100倍的性能改进?
    [2 查询优化:用加入 最新的应用程序通过用内部连接替换子查询,从而大大改善了性能。原始代码在子句中使用了一个子查询: 其中ID中的IN(从...中选择ID) 更改导致了惊人的100倍加速,将执行时间从50秒降至0.3秒。 这就提出了一个问题:为什么如此巨大的差异? 关键在于理解子查询行为。 一...
    编程 发布于2025-03-24
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-24

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3