DSL
イクスプレッションビルダ †
一言要約 †
イクスプレッションビルダとは、セマンティックモデルの上に被せられる、流れるようなインターフェイスを提供するオブジェクトのことを指す。
要約 †
- 独立したメソッドを提供するAPIのことをここではコマンドクエリAPIと呼ぶが、DSLは流れるようなインターフェイスを提供するAPIを必要とする。
- イクスプレッションビルダは通常のAPI上で流れるようなインターフェイスを提供する。
How it Works †
- イクスプレッションビルダはコマンドクエリAPIの呼び出しを翻訳する流れるようなインターフェイスを提供するオブジェクト(群)
- イクスプレッションビルダの組み立て方にはいくつか種類がある。
- メソッドチェーン:それぞれがイクスプレッションビルダを返すメソッドをつなげる。
- ネストされた関数:スーパークラスないしグローバル関数としてイクスプレッションビルダを使う。
- シンプルなケースではイクスプレッションビルダを1つしか使わないが、より複雑なケースでは複数のイクスプレッションビルダを用いる。
- イクスプレッションビルダを明確に分離するには、コマンドクエリAPIを備えたセマンティックモデルを作るのが良い。
- イクスプレッションビルダはこのセマンティックモデル上でふるまう。
When to use it †
- 基本的には使う。
- じゃあ、どんな時には使わない方がいいかというと・・・
- セマンティックモデル自体が流れるようなインターフェイスを備えていて、翻訳するレイヤが必要ない場合。
- しかし、流れるようなセマンティックモデルはそうあるものではない。
JMockの具体例 †
- JMockに見る、メソッドチェーンとオブジェクトスコーピングの例。
mainframe.expects(once())
.method("buy").with(eq(QUANTITY))
.will(returnValue(TICKET));
- 上記のコードにおける、expects() method()などがメソッドチェーン、once()、returnValue()がオブジェクトスコーピングによって定義されたネストされた関数。
- メソッドチェーンはDSLの用法を固定化し、オブジェクトスコーピングは柔軟な拡張性をもたらす。
ファウラーへのフィードバック †
担当者のつぶやき †
- 基本的には、一言要約の通り。セマンティックモデルをいきなり流れるようなインターフェイスで構築せず、コマンドクエリAPIを使うことが推奨されているあたりがポイントかと。
- JMockの例が面白いですが。ファウラーが言っている通り、具体的な話は別のチャプターにあるようです。具体例なので細かい話は本文を参照して下さい。
- 「流れるようなインターフェイス」ってずっと言ってみたかったんですが、このくらい言ってとりあえず満足しました。(あとは実装しないと)
みんなの突っ込み †
- 流れるようなインターフェイスって設計するのムズくないすか? -- kakuda?