7️⃣

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

2024/02/07に公開

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

2.11 引数が無効な場合には例外を投げる

無効な引数に基づいてオブジェクトが作成されるのを防ぐことができ、作成されたオブジェクトが正しいものであると安心できる。

class Money {
  constructor(value: number) {
    if (value < 0) {
      throw new Error()
    }
  }
}

2.12 サービスは少数のエントリポイントを持つイミュータブルなオブジェクトグラフとして定義する

コントローラ(エントリポイント)が呼び出された時点で、全ての依存関係を知っているかつ、持っていて、コンストラクタ引数として列挙できれば、一度に依存関係を作成できる。
結果、かなり大きなオブジェクトグラフが得られる。

サービスロケータ(クラスの依存関係を管理し、必要なサービス(オブジェクトやコンポーネント)を提供するもの)は、コントローラを取得するためのパブリックメソッドだけ提供すれば良くなる。

class ServiceContainer {
  public HomePageController(): HomePageController {
    return new HomePageController(
      this.userRepo(),
      this.resFactory(),
      this.templateRenderer(),
    )
  }

  private userRepo() {}
  private resFactory() {}
  private templateRenderer() {}
}

const serviceContainer = new ServiceContainer()
if (url === "/") {
  ctr = serviceContainer.HomePageController();
  res = ctr.execure(req)
} else if ... 

2.13 まとめ

サービスは一度で作成し、依存関係はコンストラクタ引数として渡す!
コンストラクタ引数の検証は忘れないこと!
作成後のサービスはイミュータブルに!

Discussion