デリゲーションのヘルパーの“知り方”

デリゲーション・パターンにおいて、仕事の依頼主をクライアント(またはカスタマー)、依頼される先である代理業者をヘルパーと呼ぶことにする。掃除代行業者とかがヘルパーだと思えばよい。

ヘルパーの仕様記述

ヘルパーが何ができるかは、インターフェースまたはプロトコルで記述する。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.";
    }
  }
};
クライアントがヘルパーを知る方法
  1. 固定されたグローバルな名前を事前に知っている
    1. オブジェクトのロケーションを知っている。
    2. オブジェクトのIDを知っている。
    3. オブジェクトの不変なスナップショットを知っている。
  2. ヘルパーがモジュール内に居て、モジュール名と公開名を事前に知っている。
  3. ヘルパーを指す変数を持っている。
    1. コンストラクタでヘルパーがセットされる。
    2. 依存性注入でヘルパーがセットされる。
  4. ヘルパーを自分で探しにいく。今回は考えない。
クライアントがヘルパーを変更する方法
  1. 別なヘルパーの固定されたグローバルな名前を事前に知っている
  2. 固定されたグローバルな名前に別なヘルパーが代入される(クライアントは知らない)
  3. 依存性注入でヘルパーが再度セットされる。
  4. 別なヘルパーを自分で探しにいく。今回は考えない。