それが助け場合、私は依存関係逆転の原則は、私が働く場所について来た場所を説明します。
私はコンテンツ管理システムを使用しています。コンテンツ管理システムは、画像を保存し、人々がそれらを取得できるようにするシステムです。
Retrieve()
// code to initialize a vendor's API
// code to pass in system credentials
// code to clear the vendor's "current workitem list"
// code to pull the document to the current workitem list
// code to get content files from that document
// code to format those files for passing back to the user
基本的には、ベンダーへのフックは左右:
さて、ここで私たちの現在の(悪い)C++のコードは次のようになります。これは単なる関数です。コード全体で同じです。今
は、あなたが言われていると想像:
「Sumithは、我々は新しいイメージングシステムに移動している - 私たちはXYZを、ベンダーABCから移動している起動して動作するようにコードを変更することに取り組んでいます。新しいシステム。
...ええと...ええええええええええええええええええええええええええええええそのすべてのコード。すべての単一機能で、そのベンダとのインターフェイスを持つプログラムのすべての部分で。 Dependency Inversionの冗談は、基本的には「あなたのランプを電気配線に直接播種しないでしょうか?まあ、私たちのグループがあります。
ここで、依存性の逆転がそれをどのように処理するかを示します。
Retrieve()
// Code that initializes an Interface we coded up
// Code that uses that interface, to pull up a doc (which, again, is an interface)
// Code that returns that doc interface's data
...とそのインターフェイス?だから、
Interface SimpleExample
void Initialize();
DocExample GetDoc();
Interface DocExample
byte[] GetFileData();
、マネージャーが言うとき、「ねえ、私たちはXYZをベンダーに移行している...」
を...あなたが自分自身に考える必要があるすべては、「さて、私がする必要があります私の 'SimpleExample'インターフェイスを実装する新しいクラスをプログラミングして、そのプログラムのコードを変更することなく既存のコードにプラグインすることができます。
今、私は全部の書き直しに取り組んでいます。私はあなたに教えてください。依存性の逆転の原理は、すでに私の時間を節約しています。私は "ContentManagement"インタフェースを作成します(私は抽象クラスを使用していますが、それは同様に機能します)。私がしなければならないことは、プログラムはContentManagementインタフェースを実装するクラスです。なしことをやろうとしている...
ContentManagement vendorToUse;
if (some criteria or such)
vendorToUse = instanceOfNewVendor;
else
vendorToUse = instanceOfOldVendor;
vendor.Initialize();
Document doc = vendor.Retrieve(...);
... etc
D.I.:それから私は、このようなコードを持つことができます悪夢になるだろう - 基本的に2つの別々のバージョンの機能を持たなければならないだろう。
はい動作します。詳細はMartin Fowlerの[Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection)と[article](https://martinfowler.com/articles/injection.html)を参照してください。 – rafaelim