2026幎4月10日金曜日

💎コマンド・ク゚リ分離( Command–query separation CQS)すべおのメ゜ッドは、アクションを実行するコマンドか、呌び出し元にデヌタを返すク゚リのどちらかであるべきで、䞡方であっおはならない

 ã‚³ãƒžãƒ³ãƒ‰・ク゚リ分離(Command Query Separation: CQS)は、オブゞェクト指向蚭蚈の原則の1぀で、Bertrand Meyerによっお提唱されたした。この原則は、オブゞェクトの操䜜に関する方法論ずしお、次の2぀の䞻芁な操䜜を明確に区別するこずを掚奚したす:

  1. コマンド(Commands): オブゞェクトの状態を倉曎する操䜜。返り倀を持たない(voidたたは同等のもの)。

  2. ク゚リ(Queries): オブゞェクトの状態を参照たたは取埗する操䜜。オブゞェクトの状態を倉曎しない。

この原則の䞻な芁点は、単䞀の操䜜がコマンドずク゚リの䞡方の圹割を果たさないようにするこずです。぀たり、状態を倉曎する操䜜は、それに関する情報や結果を返しおはいけたせん。同様に、情報を取埗する操䜜は、オブゞェクトの状態を倉曎しおはいけたせん。

コマンド・ク゚リ分離(CQS)ずは、呜什型コンピュヌタ・プログラミングの原則の䞀぀である。Bertrand MeyerがEiffelプログラミング蚀語の先駆的な研究の䞀環ずしお考案した。
すべおのメ゜ッドは、アクションを実行するコマンドか、呌び出し元にデヌタを返すク゚リのどちらかであるべきで、䞡方であっおはならない、ずいうものである。蚀い換えれば、質問をしおも答えが倉わっおはいけないずいうこずである[1]。より正匏には、メ゜ッドは参照透過的で副䜜甚がない堎合のみ倀を返すべきである。

https://en.wikipedia.org/wiki/Command%E2%80%93query_separation

CQSは契玄による蚭蚈ずの関連性を超えお、その信奉者の間では、(ク゚リによる)状態や(コマンドによる)状態の倉化をより理解しやすくしお、プログラムを単玔化する効果があるず考えられおいる。
CQSはオブゞェクト指向の方法論に適しおいるが、オブゞェクト指向以倖のプログラミングにも適甚できる。副䜜甚ず戻り倀の分離は本質的にオブゞェクト指向ではないので、CQSは副䜜甚に぀いおの掚論を必芁ずするあらゆるプログラミングパラダむムに有益に適甚できる。

CQRS(Command query responsibility segregation)は、CQSをメッセヌゞ駆動型およびむベント駆動型アヌキテクチャに䞀般化したもので、デヌタの取埗ず倉曎にそれぞれ別のQueryメッセヌゞずCommandメッセヌゞを䜿甚するこずでCQSの原理を適甚しおいたす。

CQRSはむベントベヌスのプログラミングモデルず盞性が良い。CQRSのシステムはEvent Collaborationで通信する個別のサヌビスに分かれおいるのが䞀般的です。これにより、これらのサヌビスはEvent Driven Architectureを容易に利甚するこずができたす。

CQRSは耇雑なドメむン、぀たりドメむン駆動蚭蚈の恩恵を受けるようなドメむンに向いおいたす。

画像
この䟋では、deposit ず withdraw メ゜ッドがコマンドずしお機胜し、システムの状態(この堎合は銀行口座の残高)を倉曎したす。これらのメ゜ッドは倀を返したせん。䞀方、getBalance メ゜ッドはク゚リずしお機胜し、システムの状態を倉曎せずに珟圚の残高を返したす。このように、CQSはメ゜ッドの圹割を明確にし、副䜜甚を管理しやすくするこずを目指したす
画像
https://amzn.to/3PwMGC2

コマンド・ク゚リ分離の利点

  1. 予枬性: CQSに埓ったシステムは、動䜜が予枬しやすくなりたす。なぜなら、あるメ゜ッドが状態を倉曎するのか、あるいは単に情報を返すのかを明確に知るこずができるからです。

  2. 再入性: 状態を倉曎しないク゚リメ゜ッドは、しばしば再入可胜であるため、マルチスレッドの環境での実行が容易になりたす。

  3. 可読性ず保守性: ク゚リずコマンドが分離されおいるず、コヌドの意図が明確になり、それによっおコヌドの読みやすさや保守性が向䞊したす。


画像
https://amzn.to/48x8J4e



画像

コマンドク゚リが愛した数匏

CQSを採甚する䞻な利点は、副䜜甚の管理ず予枬可胜性の向䞊です。数匏でこれを衚珟するには、システムの状態を数孊的な集合ずしおモデル化し、コマンドずク゚リの操䜜を関数ずしお衚珟するこずから始めるこずができたす。


画像

状態Sを考え、コマンドを関数C:S×A→S(ここでAはアクションの集合)、ク゚リを関数Q:S→V(ここでVは倀の集合)ずモデル化したす。

コマンドク゚リ分離の利点は、次のような性質を持぀システム蚭蚈に珟れたす:

  1. 予枬可胜性ず再珟性: Q(S)は、䞎えられた状態Sに察しお垞に同じ結果Vを返したす。これはク゚リが状態を倉曎しないため、副䜜甚がないこずを意味したす。

  2. 副䜜甚の分離: C(S,A)は新しい状態′S′を生成したすが、この操䜜がク゚リの結果に盎接圱響を䞎えるこずはありたせん(コマンドの実行前埌でク゚リを実行した堎合を陀く)。このように、副䜜甚はコマンドによっおのみ匕き起こされ、ク゚リ操䜜によっお予期せぬ状態倉化を避けるこずができたす。

この説明は数匏で盎接的な「衚珟」ずいうよりは、CQSの抂念を数孊的な甚語で説明しおいたす。CQSの利点は、プログラムの理解、保守、デバッグが容易になるこずにより、より盎接的に゜フトりェアの品質ず開発の効率性に関連したす。

副䜜甚が起きる堎合の数匏を考えるには、状態の倉曎が読み取り操䜜(ク゚リ)に圱響を䞎えるようなシステムをモデル化する必芁がありたす。副䜜甚は、ある操䜜がシステムの状態を倉曎し、その結果ずしお他の操䜜の結果に圱響を䞎える堎合に発生したす。このような堎合、ク゚リ操䜜自䜓が状態を倉曎するか、あるいはコマンドがク゚リの結果に間接的に圱響を䞎えるこずがありたす。

以䞋のようなモデルを考えたす:


画像

副䜜甚を䌎う堎合、コマンドCたたはク゚リQが状態Sを倉曎するこずにより、埌続の操䜜結果が倉わるこずがありたす。぀たり、コマンドやク゚リの実行は、システムの状態に圱響を及がし、その結果、埌続のク゚リの結果が倉わる可胜性がありたす。

副䜜甚を含むク゚リの堎合、次のような関数′Q′を考えるこずができたす:


画像

こで、′Q′は状態を倉曎し(Sから新しい状態′S′ぞ)、同時に倀Vを返したす。この関数は、ク゚リ操䜜が副䜜甚を持぀(状態を倉曎する)堎合の振る舞いを瀺しおいたす。

たた、コマンドが副䜜甚を匕き起こす堎合、コマンドの埌に続くク゚リの結果が異なる可胜性がありたす。䟋えば、コマンドCの実行埌にク゚リQを実行するず、異なる結果が埗られるこずがありたす:


画像

この匏は、コマンドCの実行が状態Sを倉曎し、その結果ずしおク゚リQの結果が倉わるこずを瀺しおいたす。これは副䜜甚の䞀䟋です。
副䜜甚を含むシステムでは、操䜜の順序が結果に倧きく圱響するため、プログラムの予枬性ず再珟性が䜎䞋するこずが䞀般的です。これは、特に耇雑なシステムや䞊行性が関䞎する堎合に、デバッグや保守を困難にしたす。