4️⃣

[読書メモ]オブジェクト設計スタイルガイド 2章7節 with TypeScript

2024/02/04に公開

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

2.7 全ての依存関係を明示する

全ての依存関係をコンストラクタ引数として渡すこと。

  • スタティック
  • 複雑な関数は、以下の場合はオブジェクトの依存関係にすると良い
  • 提供された振る舞いをラップさせたくなる場合
  • 依存関係の振る舞いは、数行のカスタムコードで同じ結果を得られないほど複雑
  • プリミティブでなく、オブジェクトを扱っている
  • システムコールを明示する

複雑な関数の例
JSON.stringifyを直接使用するのではなく、JsonEncoderを用意しておくことで依存を明示できるようになる

class JsonEncoder {
  encode(data) {
    try {
      return JSON.stringify(data);
    } catch {
      throw new Error("err");
    }
  }
}

class ResponseFactory {
  constructor(private encoder: JsonEncoder) {}

  createResponse(data) {
    return new Response(this.encoder.encode(data));
  }
}

システムコールを明示する例

interface Clock {
  currentTime(): Date;
}

class Task {
  constructor(private clock: Clock) {}

  hoge() {
    return this.clock.currentTime();

    // this.deadline = new Date();
    // と暗黙的な依存を入れると、テストが難しくなるなどの弊害が出る。
  }

  hoge2(now: Date) {
    return now;

    // もはやClockへの依存もやめてしまうのもあり
  }
}

Discussion