このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

状態遷移と状態変容、メイヤーのCQ分離原則

メイヤー先生のCommand-Query分離の原則はいつだって役に立つ。ただ、若干の拡張や補足は必要になる。

コマンドとして、“状態空間のendomorphismである状態遷移(transition)”以外に、“異なる状態空間のあいだの写像である状態変容(mutation)”が必要だ。transitionとmutationは同じ意味で使われることがあるが、ここでは区別する。

変容を表す写像単射(埋め込み)のとき、増進的変容(progressive mutation)、全射のときは減退的変容(degressive mutation)と呼ぶ。progressive/degressiveはスピヴァックが使っていた用語だ。恒等射も変容と考えて、恒常的変容と呼ぶことにする。

メソッドを役割に応じて次のように呼ぶ。

  • アクセッサ -- メイヤーQueryのこと
  • モディファイヤ -- メイヤーCommandのこと
  • ミューテータ -- 状態変容を引き起こすコマンド
  • リエーター -- 増進的変容を引き起こすコマンド
  • デストロイヤーー -- 減退的変容を引き起こすコマンド

他にデュプリケーターとかディスチャージャーとかもある。独立した分類ではない。

オブジェクト指向の観点で言えば、アクセッサとモディファイヤーがクラスのメソッド(オリジナルのメイヤー原則)で、基本ミューテータをクリエーターとデストロイヤーとして定義して、一般には基本ミューテータの組み合わせを使う。デュプリケーターはクリエーターの一種、ディスチャージャーはデストロイヤーの一種だ。

トランザクションの原則を do anything or do nothing とすると、トランザクショナルなミューテータメソッドは、X→(X + Y) の形で定式化できる。非決定性写像だが、成功変容 f:X→Y を使って、F(x) = x または F(x) = f(x) = y と書ける。

ベキ等性は、本来endomorphismにしか定義できないが、ミューテータの(擬似的)ベキ等性は定義できるだろう。それはある種の安全性となるだろう。