Dependency InjectionとIoC Containersについての講演を予定しており、それを使用するための良い議論を探しています。
このテクニックとこれらのツールを使用する最も重要な利点は何ですか?
Dependency InjectionとIoC Containersについての講演を予定しており、それを使用するための良い議論を探しています。
このテクニックとこれらのツールを使用する最も重要な利点は何ですか?
回答:
私にとって最も重要なことは、単一責任の原則に従うことを容易にすることです。
DI / IoCを使用すると、オブジェクト間の依存関係を簡単に管理できます。その結果、一貫性のある機能を独自のコントラクト(インターフェイス)に分割することが容易になります。その結果、DI / IoCを知って以来、私のコードははるかにモジュール化されました。
これの別の結果は、Open-Closed Principleをサポートする設計への道をはるかに簡単に見ることができることです。これは、最も自信に満ちたテクニックの1つです(自動テストに次ぐ)。私は、オープンクローズドプリンシプルの美徳を十分に支持できるとは思わない。
DI / IoCは、私のプログラミングキャリアで「ゲームチェンジャー」であった数少ないものの1つです。DI / IoCを学習する前と後に書いたコードの間には、品質に大きなギャップがあります。もう少し強調しておきましょう。 巨大なコードの品質を向上させます。
本当に私の目を開いた例は、そのような方法で作成されたオブジェクトを簡単に単体テストできるようにする方法を見ていました。それ以前は、単体テストのためにオブジェクトを分離しようとして問題がありました。多くの場合、はるかに大きなシステムとやり取りするためのテストを作成します。これは、システム全体の予測可能性がはるかに低く、個々のコンポーネントよりも変更が発生しやすいため、非常に困難でした。
実際のメリットは技術的なものよりも政治的なものだと思います。DIは、単なるService Locatorパターンの代替であり、それ以上のものではありません。それ自体では、SRPやOCPのような原則に従うことや、レイヤーを分離することは簡単にはなりません。他の回答者は、IMOという異なる概念と手法を混同しています。
Service Locatorを使用するか、適用可能な場合(ほとんどの場合)に直接依存関係をインスタンス化するだけで、高い凝集度と低い結合に関して同じ目標を達成できます。
今、私は多くの人がこの意見に反対することを知っています。具体的な例を説明させていただきます。
テストの目的で内部オブジェクトを公開するためにDIが使用される場合、パターンは悪用されています。