」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 命令查詢分離(CQS):更好的軟件設計指南

命令查詢分離(CQS):更好的軟件設計指南

發佈於2025-03-23
瀏覽:351

命令查詢分離(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_...
    程式設計 發佈於2025-03-24
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於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 dict...
    程式設計 發佈於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