「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > コマンドクエリ分離(CQS):より良いソフトウェアデザインのガイド

コマンドクエリ分離(CQS):より良いソフトウェアデザインのガイド

2025-03-23に投稿されました
ブラウズ:305

コマンドクエリ分離(CQS)は、コードベースの明確さとシンプルさを促進するソフトウェア設計の基本原則です。 Bertrand Meyerによって造られたこの原則は、システム内のすべてのメソッドがアクション(コマンド)を実行するか、データ(クエリ)を返す必要があるが、両方ではないことを述べています。この区別により、コードが理解し、テストし、維持しやすくなります。

このブログ投稿では、CQSの重要な側面、それを実装する方法、およびそれがソフトウェア開発にもたらす利点を調べます。また、API設計やデータベースの相互作用など、実際のシナリオにCQを適用する例を提供します。

1️⃣ cqsの基本を理解する

そのコアでは、CQSは機能を2つの異なるカテゴリに分離します。

コマンド:システムの状態を変更しますが、値を返さないアクションを実行します(たとえば、データベースの更新または電子メールの送信)

を実行します。

queries:システム状態を変更せずにデータを取得します(たとえば、データベースからユーザーの詳細を取得します)。

この分離は、コードに関する推論を簡素化し、意図しない副作用を回避します。

2️⃣ cqsを使用することの利点
改善されたコードの読みやすさ:コマンドとクエリの明確な区別により、コードが理解しやすくなります。
副作用の減少:クエリは状態を変更せず、予測可能な動作を確保します。
より簡単なテスト:コマンドとクエリを個別にテストすることができ、テストの場合の複雑さを軽減できます。
スケーラブルな設計:モジュール式および分離されたコードを促進し、システムのスケーリングと拡張を容易にします。

3️⃣ cqsの実装

の実装

例:express.js api

CQS原則をExpress.jsアプリケーションに適用しましょう:

? CQなし:

app.post('/user', (req, res) => {
  const user = createUser(req.body); // Command
  res.json(user); // Query
});

? CQSで:

app.post('/user', (req, res) => {
  createUser(req.body); // Command
  res.sendStatus(201);
});

app.get('/user/:id', (req, res) => {
  const user = getUser(req.params.id); // Query
  res.json(user);
});

ここでは、コマンド(CreateUser)とクエリ(getuser)が分離されており、各機能の責任がより明確になります。

4️⃣課題と解決策

レガシーコードとの統合:既存のコードベースでCQを採用するには、リファクタリングが必要になる場合があります。新しい機能や重要なコンポーネントに焦点を当てて、小さく始めてください。

パフォーマンスオーバーヘッド: CQSへの厳密な順守は、追加の関数呼び出しにつながる場合があります。明確さとパフォーマンスのバランスをとるために選択的に最適化します。


結論

コマンドクエリ分離は、ソフトウェア設計の明確さと保守性を促進するシンプルでありながら強力な原則です。このアプローチを採用することにより、推論、拡張、テストを簡単に作成できるシステムを作成できます。 APIを設計する、ドメインロジックの実装、またはデータベースインタラクションの管理など、CQSは最新のソフトウェアエンジニアリングにとって貴重なツールです。

Command Query Separation (CQS): A Guide to Better Software Design

リリースステートメント この記事は、https://dev.to/wallacefreitas/command-query-separation-cqs-a-guide-to-pertter-software-design -2jabに再現されています。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3