デリゲーション・パターンにおいて、仕事の依頼主をクライアント(またはカスタマー)、依頼される先である代理業者をヘルパーと呼ぶことにする。掃除代行業者とかがヘルパーだと思えばよい。
ヘルパーの仕様記述
ヘルパーが何ができるかは、インターフェースまたはプロトコルで記述する。JavaScriptのアクティブオブジェクト(プロパティに関数も持つオブジェクト)の場合は、型定義がインターフェース記述になる。
JsDocのオブジェクト型定義と関数型定義が使える。
/** * @callback Calc * @param {number} num1 * @param {number} num2 * @returns {number} */ /** @type {Calc} */ const add = (num1, num2) => { return num1 + num2 }
/** * @typedef User * @property {string} name ユーザー名 * @property {number} age ユーザーの年齢 * */ /** * @type {User} */ let user1
ヘルパーの記述も関与〈エンゲージメント〉記述であり、メイヤーの契約であり、指標の一種。関与記述があれば、それを組み立てて依存グラフ=構造グラフを作れる。
アクティブオブジェクトの型定義の例
/** @callback Checker @this {Object} @param {Object} arg @returns {string} */ /** @typedef Active @property {string} title @property {Checker} checker */ /** アクティブオブジェクト Foo * @type Active */ export var ActiveFoo = { title: "Foo", checker: function(arg) { if (typeof arg === 'object') { return "Yes, object."; } else { return "No, other."; } } };
クライアントがヘルパーを知る方法
- 固定されたグローバルな名前を事前に知っている
- オブジェクトのロケーションを知っている。
- オブジェクトのIDを知っている。
- オブジェクトの不変なスナップショットを知っている。
- ヘルパーがモジュール内に居て、モジュール名と公開名を事前に知っている。
- ヘルパーを指す変数を持っている。
- コンストラクタでヘルパーがセットされる。
- 依存性注入でヘルパーがセットされる。
- ヘルパーを自分で探しにいく。今回は考えない。
クライアントがヘルパーを変更する方法
- 別なヘルパーの固定されたグローバルな名前を事前に知っている
- 固定されたグローバルな名前に別なヘルパーが代入される(クライアントは知らない)
- 依存性注入でヘルパーが再度セットされる。
- 別なヘルパーを自分で探しにいく。今回は考えない。