コマンドクエリ分離とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > コマンドクエリ分離の意味・解説 

コマンドクエリ分離

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/04/10 19:36 UTC 版)

コマンドクエリ分離(コマンドクエリぶんり、: Command-query separation, CQS)は命令型プログラミングにおける原則Eiffel言語における先駆的な仕事の一環としてバートランド・メイヤーによって考案された。

この原則は、全てのメソッドはアクションを実行する「コマンド」か、呼び出し元にデータを返す「クエリ」のどちらかであるべきで、その両方を行ってはならないということを述べている。これは「質問をすることが答えを変えてはならない[1]」とも表現される。

形式的には、メソッドは参照透過性を持ちかつ、副作用を持たない場合のみ値を返すべきだと表現される。

契約プログラミングとのつながり

コマンドクエリ分離は、契約プログラミング(DbC)の手法によく適している。DbCでは、プログラムの設計はソースコードに埋め込まれた表明(アサーション)によって表現され、特定の時点においてのプログラムの状態を記述する。

DbCにおいて、表明はプログラムロジックでなく、設計のアノテーションと見做されるため、その実行はプログラムの状態に影響を与えてはならない。CQSでは値を返すあらゆるメソッド(=クエリ)はプログラムの状態を変更する心配なくどの表明からも呼び出すことができるため、DbCにとって有益であるとされる。

理論的には、健全性の尺度を確立するものであり、これによりプログラムの状態を変更することなくその状態について推測することができる。実際の利用においては、CQSは動作中のシステムにおける全ての表明チェックを、システムの振る舞いを意図せずして変更することを防ぎながら、パフォーマンス向上のためにスキップすることを可能にする。CQSはまた、特定の種類のハイゼンバグの発生を防ぐこともある。

契約プログラミングとのつながりを超えて、CQSはその信奉者によって、プログラムをシンプルにする効果があり、クエリを通じてプログラムの状態を、コマンドを通じて状態の変更をさらにわかりやすくすることができると考えられている[要出典]

コマンドクエリ責任分離

コマンドクエリ責任分離 (CQRS) はCQSの概念をサービスのアーキテクチャのレベルにまで拡張したものであり、「クエリ」と「コマンド」でそれぞれ異なるインターフェースとデータモデルを用意し、データ取得にはクエリを、データ変更にはコマンドを用いるという形でCQS原則を適用している[2][3]

制約

CQSでは再入可能性マルチスレッドを正しく実装する場合に複雑になる場合がある。これは通常、コマンドクエリ分離を実装する際にスレッドセーフでないパターンが用いられている時に発生する。

以下はCQSに従っていない簡単な例である。この関数は状態を変更し、かつ値を返しているため、CQSには従っていない。マルチスレッドソフトウェアにおいては、このような関数を用意することでプログラムの他のすべての部分での排他制御の問題を解決することができる。

private int x;
public int incrementAndReturnX() {
    lock x;   // by some mechanism
    x = x + 1;
    int x_copy = x;
    unlock x; // by some mechanism
    return x_copy;
}

以下はCQS完全な例である。注意すべきは、これはシングルスレッドなアプリケーションでのみ安全に利用できるということである。マルチスレッドなプログラムにおいては、呼び出し元において increment() と value() が呼び出される間に競合状態が発生する。

private int x;
public int value() {
    return x;
}
void increment() {
    x = x + 1;
}

シングルスレッドのプログラムにおいても、クエリとコマンドが一体化したメソッドが非常に便利である場合がある。マーティン・ファウラーはその例として、スタックに対する pop() メソッドを挙げている。

関連項目

出典

  1. ^ Meyer. “Eiffel: a language for software engineering”. p. 22. 2018年12月16日時点のオリジナルよりアーカイブ。2014年12月16日閲覧。
  2. ^ Young. “CQRS Documents”. 2012年12月28日閲覧。
  3. ^ Fowler. “CQRS”. 2011年7月14日閲覧。

参考文献

  • Meyer, Bertrand (September 1994) [1988]. Object-oriented Software Construction. Prentice Hall. ISBN 0-13-629049-3 

外部リンク




英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  
  •  コマンドクエリ分離のページへのリンク

辞書ショートカット

すべての辞書の索引

「コマンドクエリ分離」の関連用語

コマンドクエリ分離のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



コマンドクエリ分離のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのコマンドクエリ分離 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2025 GRAS Group, Inc.RSS