1. ホーム
  2. oop

[解決済み] Dependency InjectionはEncapsulationを犠牲にしなければならないのか?

2022-06-18 13:17:18

質問

依存性注入の典型的なメカニズムは、クラスのコンストラクタまたはクラスのパブリックプロパティ(メンバ)を通して注入することです。

これは、注入される依存関係を公開し、カプセル化の OOP 原則に違反します。

このトレードオフを特定することは正しいですか?あなたはこの問題にどのように対処しますか。

以下の私自身の質問に対する回答もご覧ください。

どのように解決するのですか?

この問題には、あなたが興味深いと思うかもしれない別の見方があります。

IoC/依存性注入を使うとき、私たちはOOPの概念を使っているわけではありません。確かに私たちは「ホスト」として OO 言語を使用していますが、IoC の背後にあるアイデアはコンポーネント指向のソフトウェア工学から来ており、OO ではありません。

コンポーネント ソフトウェアは、依存関係を管理することがすべてです。一般的に使用されている例は、.NET のアセンブリ メカニズムです。各アセンブリは、それが参照するアセンブリのリストを公開し、これにより、実行中のアプリケーションに必要な部分をまとめる (および検証する) のがはるかに容易になります。

IoC を介して OO プログラムにも同様の技術を適用することで、プログラムの構成と保守を容易にすることを目的としています。依存関係を (コンストラクター パラメーターまたは何かとして) 公開することは、この重要な部分です。コンポーネント/サービス指向の世界では、詳細が漏れるような「実装タイプ」が存在しないため、カプセル化は実際には適用されないのです。

残念ながら、私たちの言語では現在、細かい粒度のオブジェクト指向の概念と粗い粒度のコンポーネント指向の概念を分離できないので、この区別はあなたの頭の中だけに留めておく必要があります :)