2017-08-01 54 views
0

私はDependency Inversion(SOLIDの 'D')について読んで、いくつかの例を調べましたhere依存関係の反転は本当に機能しますか?

しかし、どのように依存関係を完全に取り除くことができないのか分かりません!

この記事によれば、消費者 - >ユーティリティの関係は、消費者パッケージに契約/インタフェースを導入することによって、ユーティリティ - >消費者に変更することができます。

さらに、コンシューマ - >契約< - ユーティリティのように、契約/インターフェイスを別のパッケージに移動することで、逆依存関係を完全に切り離すことができます。

上記のレイアウトでは、コンシューマーがユーティリティを使用するためには、工場はありませんか?これは次のように、元の依存関係を思い出させる:

消費者 - >ファクトリー - >ユーティリティ

+0

はい動作します。詳細はMartin Fowlerの[Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection)と[article](https://martinfowler.com/articles/injection.html)を参照してください。 – rafaelim

答えて

0

それが助け場合、私は依存関係逆転の原則は、私が働く場所について来た場所を説明します。

私はコンテンツ管理システムを使用しています。コンテンツ管理システムは、画像を保存し、人々がそれらを取得できるようにするシステムです。

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つの別々のバージョンの機能を持たなければならないだろう。

関連する問題