ã³ãã³ã・ã¯ãšãªåé¢(Command Query Separation: CQS)ã¯、ãªããžã§ã¯ãæåèšèšã®ååã®1ã€ã§、Bertrand Meyerã«ãã£ãŠæå±ãããŸãã。ãã®ååã¯、ãªããžã§ã¯ãã®æäœã«é¢ããæ¹æ³è«ãšããŠ、次ã®2ã€ã®äž»èŠãªæäœãæç¢ºã«åºå¥ããããšãæšå¥šããŸã:
ã³ãã³ã(Commands): ãªããžã§ã¯ãã®ç¶æ ã倿Žããæäœ。è¿ãå€ãæããªã(voidãŸãã¯åçã®ãã®)。
ã¯ãšãª(Queries): ãªããžã§ã¯ãã®ç¶æ ãåç §ãŸãã¯ååŸããæäœ。ãªããžã§ã¯ãã®ç¶æ ã倿Žããªã。
ãã®ååã®äž»ãªèŠç¹ã¯、åäžã®æäœãã³ãã³ããšã¯ãšãªã®äž¡æ¹ã®åœ¹å²ãæãããªãããã«ããããšã§ã。ã€ãŸã、ç¶æ ã倿Žããæäœã¯、ããã«é¢ããæ å ±ãçµæãè¿ããŠã¯ãããŸãã。åæ§ã«、æ å ±ãååŸããæäœã¯、ãªããžã§ã¯ãã®ç¶æ ã倿ŽããŠã¯ãããŸãã。
ã³ãã³ã・ã¯ãšãªåé¢(CQS)ãšã¯、åœä»€åã³ã³ãã¥ãŒã¿・ããã°ã©ãã³ã°ã®ååã®äžã€ã§ãã。Bertrand MeyerãEiffelããã°ã©ãã³ã°èšèªã®å é§çãªç ç©¶ã®äžç°ãšããŠèæ¡ãã。
ãã¹ãŠã®ã¡ãœããã¯、ã¢ã¯ã·ã§ã³ãå®è¡ããã³ãã³ãã、åŒã³åºãå ã«ããŒã¿ãè¿ãã¯ãšãªã®ã©ã¡ããã§ããã¹ãã§、äž¡æ¹ã§ãã£ãŠã¯ãªããªã、ãšãããã®ã§ãã。èšãæããã°、質åãããŠãçããå€ãã£ãŠã¯ãããªããšããããšã§ãã[1]。ããæ£åŒã«ã¯、ã¡ãœããã¯åç §ééçã§å¯äœçšããªãå Žåã®ã¿å€ãè¿ãã¹ãã§ãã。
CQSã¯å¥çŽã«ããèšèšãšã®é¢é£æ§ãè¶ ããŠ、ãã®ä¿¡å¥è ã®éã§ã¯、(ã¯ãšãªã«ãã)ç¶æ ã(ã³ãã³ãã«ãã)ç¶æ ã®å€åãããçè§£ããããããŠ、ããã°ã©ã ãåçŽåãã广ããããšèããããŠãã。
CQSã¯ãªããžã§ã¯ãæåã®æ¹æ³è«ã«é©ããŠããã、ãªããžã§ã¯ãæå以å€ã®ããã°ã©ãã³ã°ã«ãé©çšã§ãã。å¯äœçšãšæ»ãå€ã®åé¢ã¯æ¬è³ªçã«ãªããžã§ã¯ãæåã§ã¯ãªãã®ã§、CQSã¯å¯äœçšã«ã€ããŠã®æšè«ãå¿ èŠãšããããããããã°ã©ãã³ã°ãã©ãã€ã ã«æçã«é©çšã§ãã。
CQRS(Command query responsibility segregation)ã¯、CQSãã¡ãã»ãŒãžé§ååããã³ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã«äžè¬åãããã®ã§、ããŒã¿ã®ååŸãšå€æŽã«ããããå¥ã®Queryã¡ãã»ãŒãžãšCommandã¡ãã»ãŒãžã䜿çšããããšã§CQSã®åçãé©çšããŠããŸã。
CQRSã¯ã€ãã³ãããŒã¹ã®ããã°ã©ãã³ã°ã¢ãã«ãšçžæ§ãè¯ã。CQRSã®ã·ã¹ãã ã¯Event Collaborationã§éä¿¡ããåå¥ã®ãµãŒãã¹ã«åãããŠããã®ãäžè¬çã§ã。ããã«ãã、ãããã®ãµãŒãã¹ã¯Event Driven Architectureã容æã«å©çšããããšãã§ããŸã。
CQRSã¯è€éãªãã¡ã€ã³、ã€ãŸããã¡ã€ã³é§åèšèšã®æ©æµãåãããããªãã¡ã€ã³ã«åããŠããŸã。


ã³ãã³ã・ã¯ãšãªåé¢ã®å©ç¹
äºæž¬æ§: CQSã«åŸã£ãã·ã¹ãã ã¯、åäœãäºæž¬ãããããªããŸã。ãªããªã、ããã¡ãœãããç¶æ ã倿Žããã®ã、ãããã¯åã«æ å ±ãè¿ãã®ããæç¢ºã«ç¥ãããšãã§ããããã§ã。
åå ¥æ§: ç¶æ ã倿Žããªãã¯ãšãªã¡ãœããã¯、ãã°ãã°åå ¥å¯èœã§ãããã、ãã«ãã¹ã¬ããã®ç°å¢ã§ã®å®è¡ã容æã«ãªããŸã。
å¯èªæ§ãšä¿å®æ§: ã¯ãšãªãšã³ãã³ããåé¢ãããŠãããš、ã³ãŒãã®æå³ãæç¢ºã«ãªã、ããã«ãã£ãŠã³ãŒãã®èªã¿ããããä¿å®æ§ãåäžããŸã。


ã³ãã³ãã¯ãšãªãæããæ°åŒ
CQSãæ¡çšããäž»ãªå©ç¹ã¯、å¯äœçšã®ç®¡çãšäºæž¬å¯èœæ§ã®åäžã§ã。æ°åŒã§ããã衚çŸããã«ã¯、ã·ã¹ãã ã®ç¶æ ãæ°åŠçãªéåãšããŠã¢ãã«åã、ã³ãã³ããšã¯ãšãªã®æäœã颿°ãšããŠè¡šçŸããããšããå§ããããšãã§ããŸã。

ç¶æ Sãèã、ã³ãã³ãã颿°C:S×A→S(ããã§Aã¯ã¢ã¯ã·ã§ã³ã®éå)、ã¯ãšãªã颿°Q:S→V(ããã§Vã¯å€ã®éå)ãšã¢ãã«åããŸã。
ã³ãã³ãã¯ãšãªåé¢ã®å©ç¹ã¯、次ã®ãããªæ§è³ªãæã€ã·ã¹ãã èšèšã«çŸããŸã:
äºæž¬å¯èœæ§ãšåçŸæ§: Q(S)ã¯、äžããããç¶æ Sã«å¯ŸããŠåžžã«åãçµæVãè¿ããŸã。ããã¯ã¯ãšãªãç¶æ ã倿Žããªããã、å¯äœçšããªãããšãæå³ããŸã。
å¯äœçšã®åé¢: C(S,A)ã¯æ°ããç¶æ ′S′ãçæããŸãã、ãã®æäœãã¯ãšãªã®çµæã«çŽæ¥åœ±é¿ãäžããããšã¯ãããŸãã(ã³ãã³ãã®å®è¡ååŸã§ã¯ãšãªãå®è¡ããå Žåãé€ã)。ãã®ããã«、å¯äœçšã¯ã³ãã³ãã«ãã£ãŠã®ã¿åŒãèµ·ããã、ã¯ãšãªæäœã«ãã£ãŠäºæãã¬ç¶æ å€åãé¿ããããšãã§ããŸã。
ãã®èª¬æã¯æ°åŒã§çŽæ¥çãª「衚çŸ」ãšããããã¯、CQSã®æŠå¿µãæ°åŠçãªçšèªã§èª¬æããŠããŸã。CQSã®å©ç¹ã¯、ããã°ã©ã ã®çè§£、ä¿å®、ãããã°ã容æã«ãªãããšã«ãã、ããçŽæ¥çã«ãœãããŠã§ã¢ã®å質ãšéçºã®å¹çæ§ã«é¢é£ããŸã。
å¯äœçšãèµ·ããå Žåã®æ°åŒãèããã«ã¯、ç¶æ ã®å€æŽãèªã¿åãæäœ(ã¯ãšãª)ã«åœ±é¿ãäžãããããªã·ã¹ãã ãã¢ãã«åããå¿ èŠããããŸã。å¯äœçšã¯、ããæäœãã·ã¹ãã ã®ç¶æ ã倿Žã、ãã®çµæãšããŠä»ã®æäœã®çµæã«åœ±é¿ãäžããå Žåã«çºçããŸã。ãã®ãããªå Žå、ã¯ãšãªæäœèªäœãç¶æ ã倿Žããã、ãããã¯ã³ãã³ããã¯ãšãªã®çµæã«éæ¥çã«åœ±é¿ãäžããããšããããŸã。
以äžã®ãããªã¢ãã«ãèããŸã:

å¯äœçšã䌎ãå Žå、ã³ãã³ãCãŸãã¯ã¯ãšãªQãç¶æ Sã倿Žããããšã«ãã、åŸç¶ã®æäœçµæãå€ããããšããããŸã。ã€ãŸã、ã³ãã³ããã¯ãšãªã®å®è¡ã¯、ã·ã¹ãã ã®ç¶æ ã«åœ±é¿ãåãŒã、ãã®çµæ、åŸç¶ã®ã¯ãšãªã®çµæãå€ããå¯èœæ§ããããŸã。
å¯äœçšãå«ãã¯ãšãªã®å Žå、次ã®ãããªé¢æ°′Q′ãèããããšãã§ããŸã:

ãã§、′Q′ã¯ç¶æ ã倿Žã(Sããæ°ããç¶æ ′S′ãž)、åæã«å€Vãè¿ããŸã。ãã®é¢æ°ã¯、ã¯ãšãªæäœãå¯äœçšãæã€(ç¶æ ã倿Žãã)å Žåã®æ¯ãèãã瀺ããŠããŸã。
ãŸã、ã³ãã³ããå¯äœçšãåŒãèµ·ããå Žå、ã³ãã³ãã®åŸã«ç¶ãã¯ãšãªã®çµæãç°ãªãå¯èœæ§ããããŸã。äŸãã°、ã³ãã³ãCã®å®è¡åŸã«ã¯ãšãªQãå®è¡ãããš、ç°ãªãçµæãåŸãããããšããããŸã:

ãã®åŒã¯、ã³ãã³ãCã®å®è¡ãç¶æ
Sã倿Žã、ãã®çµæãšããŠã¯ãšãªQã®çµæãå€ããããšã瀺ããŠããŸã。ããã¯å¯äœçšã®äžäŸã§ã。
å¯äœçšãå«ãã·ã¹ãã ã§ã¯、æäœã®é åºãçµæã«å€§ãã圱é¿ãããã、ããã°ã©ã ã®äºæž¬æ§ãšåçŸæ§ãäœäžããããšãäžè¬çã§ã。ããã¯、ç¹ã«è€éãªã·ã¹ãã ãäžŠè¡æ§ãé¢äžããå Žåã«、ãããã°ãä¿å®ãå°é£ã«ããŸã。