2️⃣

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

2024/02/02に公開

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

2.3 サービスロケータを注入するのではなく、必要なもの自体を注入する

サービスロケータ
アプリケーションが必要な可能性のあるサービスやコンポーネントを提供する方法を知っているオブジェクトのこと。

サービスロケータを使用すると、アプリ内で使える全てのサービスにアクセス可能なので引数として、サービスロケータを注入したくなるが、余計な関数が呼ばれたりすることで依存先の実装が複雑になる。

class ServiceLocater {
  constructor(entity: Entity, responseFactory: ResponseFactory) {}
}
class Entity {
  constructor(public repository: Repository) {}
}
class Repository {
  constructor(public userRepository: UserRepository) {}
}
class UserRepository {find() {}}
class ResponseFactory {create() {}}

// 依存が多すぎて何でもできてしまう。
// 巨大なクラスになってしまい、単一責任の原則から外れた設計になりがち。
class NG {
  constructor(private locater: ServiceLocater) {}
  exec() {
    this.locater.entity.repository.userRepository.find();
    this.locater.responseFactory.create();
  }
}

// 依存が明示的で、何をするのかが分かりやいコードが書ける
class Good {
  constructor(
    private userRepository: UserRepository,
    private responseFactory: ResponseFactory
  ) {}
  exec() {
    this.userRepository.find();
    this.responseFactory.create();
  }
}

サービスが横から依存関係を取得せずに、直接利用しているかを確認しましょう。

Discussion