インジェクションを受け入れるのではなく、依存関係を直接構築するクライアントが1001人いるとします。上司によると、1001のリファクタリングはオプションではありません。実際には、ソースへのアクセスさえ許可されていません。クラスファイルだけです。
私たちがやるべきことは、これらの1001クライアントが通過するシステムを「近代化」することです。好きなことをリファクタリングできます。依存関係はそのシステムの一部です。そして、それらの依存関係のいくつかは、新しい実装を行うために変更することになっています。
私たちがやりたいことは、この多数のクライアントを満たすために、依存関係の異なる実装を構成する機能を持っていることです。悲しいことに、クライアントはコンストラクターまたはセッターによるインジェクションを受け入れないため、DIはオプションのようには見えません。
オプション:
1)クライアントが使用するサービスの実装をリファクタリングして、クライアントが現在必要としていることを行うようにします。完了です。柔軟ではありません。複雑ではありません。
2)実装をリファクタリングして、ファクトリを通じて取得したさらに別の依存関係に作業を委任します。これで、ファクトリをリファクタリングすることで、すべてが使用する実装を制御できます。
3)実装をリファクタリングして、作業をサービスロケーターを介して取得したさらに別の依存関係に委任します。これhashmap
で、少しのキャストが行われたオブジェクトへの文字列である可能性のあるサービスロケーターを構成することで、すべてが使用する実装を制御できます。
4)まだ考えていないこと。
目的:
設計が不十分な古いクライアントコードを無意味な複雑さを加えることなく未来にドラッグすることによって引き起こされる設計の損傷を最小限に抑えます。
クライアントは依存関係の実装を知っていないか制御するべきではありませんが、で構築することを主張しますnew
。制御することはできませんnew
が、構築しているクラスを制御します。
私の質問:
何を考慮しなかったのですか?
異なる実装間で構成する可能性が本当に必要ですか?何のために?
機敏。未知の多く。経営陣は変化の可能性を望んでいます。外の世界への依存を失うだけです。またテスト。
実行時の仕組みが必要ですか、それとも異なる実装を切り替えるためにコンパイル時の仕組みが必要ですか?どうして?
コンパイルの時間の仕組みで十分です。テストを除く。
どの粒度で実装を切り替える必要がありますか?一斉に?モジュールごと(それぞれがクラスのグループを含む)?クラスごと?
1001のうち、一度に実行されるのは1つだけです。すべてのクライアントが一度に使用するものを変更しても問題はないでしょう。ただし、依存関係を個別に制御することはおそらく重要です。
誰がスイッチを制御する必要がありますか?あなた/あなたの開発者チームのみ?管理者ですか?各クライアントは自分で?または、クライアントのコードのメンテナンス開発者ですか?それでは、メカニックはどれほど簡単/堅牢/完全に機能する必要があるのでしょうか?
テスト用の開発。外部ハードウェアの依存関係が変化するため、管理者。テストと構成が簡単である必要があります。
私たちの目標は、システムを迅速に作り直し、近代化できることを示すことです。
実装スイッチの実際の使用例
1つは、ハードウェアソリューションの準備が整うまで、一部のデータがソフトウェアによって提供されることです。