適応モデルと意味モデル

最近、Martin FowlerさんのDomain-Specific Languagesの読書会を始めたのですが、モデルの考え方について興味深かったので、整理してみます。

DSL Bookでは、DSLの紹介のために、Gothic Securityというサンプルを使用しています。よく映画など見られるで、「ローソク立てを引っ張り、たんすの2番目の引き出しを空け、壁を3回ノックする」と、秘密の部屋への扉が開く、というあれです。これをソフトウェアとして実装することを考えます。

このようなソフトウェアの動作は、状態遷移図で表すことができます。一例として、秘密の部屋を出現させるために「ドアを閉め→ライトをつけ(またはたんすの引き出しを開け)→たんすの引き出しを開ける(またはライトをつける)」ようなケースを考えます。この場合、状態遷移図は下図のような形で表せます*1

f:id:GOLEM-XIV:20101107223635p:image

実装におけるポイント

ポイントは、このソフトウェアで「共通的な部分」と、「変化する部分」を見極めることです。特に、このソフトウェアを使用するお客さんごとに、秘密の部屋を出現させる手順は異なることに注意しなければなりません。つまり、このソフトウェアは、様々なお客さん向けにカスタマイズされて使われることになります。

共通的な部分

今回のソフトウェアで共通的な部分は、「状態遷移図で動作を表すことができること」です。秘密の部屋を空ける手順が、お客さんごとに異なっていたとしても、状態遷移図で表すことができる点は共通です。よって、共通的な部分をステートマシンとして抽象化し、モデリングします。

以下は、書籍中で記載されている、ステートマシンのクラス図です。

f:id:GOLEM-XIV:20101107225104p:image

このように、抽象化された共通部分であり、それらのインスタンスと、そのインスタンス間の関連によって、実際のソフトウェアの動作を表すことができるようなモデルを、Adaptive Model(適応モデル)と呼びます。適応モデルはいわばGothic Securityのフレームワークになります。

変化する部分

このソフトウェアにおける「変化する部分」は、お客さんごとのセキュリティ設定です。例えば、あるお客さんは、秘密の部屋を開けるために「鏡をノックし→机の引き出しを開け→ライトをつける」という手順をが必要です。そして別のお客さんは、「ライトを消し→本棚から本を3冊取り出し→パソコンをONにする」という手順が必要になります。

これは、特定のお客さんの手順に対応するような、ステートマシンを具象化することに該当します。別の言い方をすると、その状態遷移を実現するインスタンス(EventクラスのオブジェクトやCommandクラスのオブジェクト、Stateクラスのオブジェクトなど)を生成し、関連付けたような、オブジェクト・モデルを生成することに対応します。フレームワークのインスタンスを生成し、APIを呼び出すイメージです。

このように、ソフトウェアの実行に意味を持たせるモデルを、Semantic Model(意味モデル)と呼びます。

DSLとの関連

最後に、モデルとDSLの関連について説明します。DSLは、「意味モデルをわかりやすく表すための表現」です。例えば、XMLを用いることで、Gothic Securityの設定をDSLとして記述することができます*2。API呼び出しの列に過ぎなかった意味モデルが、人間が読みやすい形式で表現されることになります。

DSLは、通常は意味モデルと一対一の関係になります。上の例の場合、XMLが実行時パースされ、意味モデルに変換されることで、ソフトウェアが実行されます。このように、意味モデルを適用モデルと分離しておくことにより、コンパイル無しにソフトウェアの設定を行うことが可能になります。

整理すると、以下の図のようになります。

f:id:GOLEM-XIV:20100801235754p:image

DSLはモデル上の薄いファサード

最近非常に注目されているDSLですが、DSL自体はモデル上の「薄いファサード」でしかありません。DSL Bookでは、「Hence the DSL is merely a thin facade over the model.」と表現しています。先ほどの、コンパイル無しにソフトウェアの設定ができるという利点も、DSLの利点というよりは、適用モデルと意味モデルをちゃんと分離しておいたことによるものですし、DSL無しでもソフトウェアは動作します。もちろん、薄いファサードであっても、開発生産性の向上や、業務メンバーとのコミュニケーションのために、DSLは非常に役立ちます。しかしながら、DSL Bookでは、DSL自体の有用性もさることながら、正しいモデルを作ることの重要性を強調しています。正しいモデルがあってこそ、DSLもその真価を発揮できるということです。

*1:Martin Flower: Domain-Specific Languagesより引用

*2:実行言語と異なる言語でDSLを記述する場合、それは外部DSLと呼ばれます。実行言語と同じ言語でDSLを記述する場合は、内部DSLと呼ばれますが、今回は説明対象外とします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です