Java における依存関係逆転原理の詳細な例

黄舟
リリース: 2017-08-11 10:12:09
オリジナル
1843 人が閲覧しました

この記事では主に Java の依存関係逆転原理の定義と問題の解決策を紹介しますので、興味のある方はぜひ一緒にご覧ください

定義: 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方とも依存すべきです。抽象化に依存しないでください。詳細は抽象化に依存する必要があります。

問題の原因: クラス A はクラス B に直接依存しています。クラス A をクラス C に依存するように変更したい場合は、クラス A のコードを変更する必要があります。このシナリオでは、通常、クラス A は複雑なビジネス ロジックを担当する高レベル モジュールであり、クラス B と C は基本的なアトミック操作を担当する低レベル モジュールです。クラス A が変更されると、プログラムに不要なリスクが生じます。

解決策: インターフェイス I に依存するようにクラス A を変更します。クラス B とクラス C はそれぞれインターフェイス I を実装します。クラス A はインターフェイス I を介してクラス B またはクラス C に間接的に接続されているため、クラス A を変更する可能性が大幅に減少します。 。反転の原理は、詳細の変動に比べて、抽象的なもののほうがはるかに安定しているという事実に基づいています。抽象化に基づいて構築されたアーキテクチャは、詳細に基づいて構築されたアーキテクチャよりもはるかに安定しています。 Java では、抽象化はインターフェイスまたは抽象クラスを指し、詳細は特定の実装クラスを指します。インターフェイスまたは抽象クラスを使用する目的は、特定の操作を行わずに仕様と規約を作成することであり、詳細を実装クラスに示すタスクは残ります。完了。


依存関係逆転の原則の核となる考え方は、インターフェイス指向プログラミングです。インターフェイス指向プログラミングが実装指向プログラミングよりも優れている理由を説明するために、引き続き例を使用します。母親は本を与えられれば、その本に従って子供に物語を語ることができるのです。コードは次のとおりです:

class Book{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(Book book){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(book.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
 } 
}
ログイン後にコピー

動作結果:

お母さんが物語を語り始めました

昔、アラブの物語がありました...

ある日、うまく実行されれば。要求は次のようになります: 反対 その本は代わりに新聞社に渡され、母親は新聞でその話をするよう求められました:

class Newspaper{ 
 public String getContent(){ 
  return "林书豪38+7领导尼克斯击败湖人……"; 
 } 
}
ログイン後にコピー

この母親にはできませんでした。それは、彼女が新聞の記事を読めなかったからです。本を新聞に置き換えただけなのに、それを読むには母親を改造する必要があります。将来雑誌に切り替える必要がある場合はどうすればよいですか?それを Web ページに置き換えてみてはどうでしょうか?マザーを常に変更する必要がありますが、これは明らかに良い設計ではありません。その理由は、マザーとブックの結合が高すぎるため、両者の結合を下げる必要があるためです。


抽象インターフェイス IReader を紹介します。単語がある限り、読み上げは読み上げです:

interface IReader{ 
 public String getContent(); 
} 
Mother类与接口IReader发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:
class Newspaper implements IReader { 
 public String getContent(){ 
  return "林书豪17+9助尼克斯击败老鹰……"; 
 } 
} 
class Book implements IReader{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(IReader reader){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(reader.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
  mother.narrate(new Newspaper()); 
 } 
}
ログイン後にコピー

実行結果:

お母さんが物語を語り始めました

昔、アラビア語の物語がありました…お母さんが物語を語り始めました

Jeremy Lin 17+ 9 ニックスがホークスを倒すのに貢献しました...


この変更後は、将来クライアント クラスがどのように拡張されても、マザー クラスを変更する必要はありません。これは単純な例にすぎません。実際の状況では、高レベルのモジュールを表すマザー クラスが、変更が必要になると、エラーが発生するリスクが非常に高くなります。したがって、依存関係逆転の原則に従うと、クラス間の結合が減少し、システムの安定性が向上し、プログラムの変更によって引き起こされるリスクが軽減されます。


依存関係逆転の原則の採用により、複数人による並列開発に大きな利便性がもたらされます。たとえば、上記の例では、Mother クラスと Book クラスが直接結合されている場合、Mother クラスは Book クラスが結合されるのを待つ必要があります。 Mother クラスは Book クラスに依存するため、コード化する前にコード化する必要があります。 Mother クラスと Book クラスは相互に関係がないため、変更されたプログラムは相互に影響を与えることなく同時に起動できます。共同開発に関わる人数が増え、プロジェクトが大規模になるほど、依存関係を引き起こす原則を採用することが重要になります。現在人気の TDD 開発モデルは、依存関係逆転の原理を最もうまく適用したものです。


上記の例で使用した依存関係の転送方法には、コンストラクターメソッドの転送とセッターメソッドの転送の2つがあると思います。依存関係の転送方法についてはよくわかりません。

実際のプログラミングでは、通常、次の 3 つの点を行う必要があります:


    低レベルのモジュールには、抽象クラスまたはインターフェイス、あるいはその両方が必要です。
  • 変数の宣言型は、可能な限り抽象クラスまたはインターフェースにする必要があります。
  • 継承を使用する場合は、Liskov 置換原則に従ってください。
  • 依存関係逆転の原理の中核は、インターフェース指向プログラミングを理解すれば、依存関係逆転も理解できるということです。

以上がJava における依存関係逆転原理の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート