2️⃣
[読書メモ]オブジェクト設計スタイルガイド 2章3節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
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