浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

処理分割の方針の一つであるコマンドクエリ分割を紹介

 CQSはCommandQuerySeparationの略であり、コマンドクエリ分割と訳されます。この語でいうコマンドとは副作用のある処理の総称であり、おおよそ作成、更新、削除処理のことを指します。クエリとは副作用のない処理の総称であり、おおよそ読み込み処理のことを指します。似た語にCQRS(コマンドクエリ責務分割)があります。こちらはデータベースの様なインフラからしてコマンドとクエリを分割する様ながっつりした分割を表す語です。
 コマンド クエリ責務分離 (CQRS) パターン – Cloud Design Patterns | Microsoft Docs
 この記事の中ではRDB(リレーショナルデータベース)を前提として、SQLのINSERT, UPDATE, DELETEをコマンド、SELECTをクエリと扱います。SQLとクエリの二語が頻出してとても紛らわしいです。この記事においてクエリの語は常にCQSの指すクエリのことを指します。
 CQSの考え方をRDBに持ってきた時、納得がいくのは複雑なSQLを発行する必要が多く生まれるのはクエリであり、コマンドはid参照を起点にする操作とファイルベースの大量INSERTぐらいで済む、ということです。webにおいてコントローラの動作はCRUDという言葉でまとめられることが多いですが、その実Readのために必要となるSQLとその構築処理はCreate, Update, Deleteに比べて複雑です。特に検索機能は時折目が回るような手間がかかります(複数テーブルにわたったりサブクエリを含んだ上で速度を気にしだすと難題になりやすいです)。
 CQSを用いた簡易にクラス図は次の様になります。CQSの慣例に従ってQueryServiceとパッケージ名をつけましたがSQLを扱うプログラムでこれをやると心底まぎらわしいのでもう少し凝った名前を付けると良いです。図はシンプルなので余り恩恵がわかりませんがテーブルやトランザクション範囲が複雑になるほど単にMVCに従って作るより構造化が上手くいきます。
 
 こうするといい具合の文量のバランスでコードが分割できる上、どのサービスがどの範囲のテーブルに責務を負っているか分かりやすくなります。

  • この記事いいね! (0)