初心者Android開発者向けDagger 2-はじめに

この記事は、著者によると、 依存関係Dagger 2フレームワークの実装を理解できない、またはそれをやろうとしている人を対象とした一連の記事の最初の部分です。 オリジナルは2017年11月18日に書かれました。 画像とGIFは元のものです。 無料翻訳。

画像


Dagger 2は、コンパイル時に実行されるJavaおよびAndroid用の完全に静的な依存性注入フレームワークです。 Dagger 2は、 Googleがサポートする以前に開発されたSquare Daggerフレームワークを改造したものです

この記事の対象者


あなたがAndroidを直接研究し、同時にJavaの知識を習得する初心者のAndroid開発者であるなら、この記事はあなたのためです。 Dagger 2を学ぼうとし、インターネットで見つけたものが少し複雑に思えた-心配しないで、私もこれを経験しました(私たちはすべて少し特別です、誰もが何かを説明するのに独自のアプローチが必要です)この記事は間違いなくあなたのためです。 依存性注入とDaggerに既に精通している場合は、新しいことを学んだり、自分でいくつかのことを明確にしたりできます。

一連の記事



必要条件


Javaプログラミング言語OOPおよびAndroid開発の原則に既に精通していることを前提としています。

中毒とは何ですか?


注:この概念を説明するために、テレビシリーズGame of Thronesとの類推を使用します。 このシリーズに慣れていない場合は、クラス名をより便利なものに置き換えることができます。 そして、あなたは間違いなくこのシリーズを見始めるべきです。

依存関係と関係を理解することは、オブジェクト指向プログラミングの概念をより明確に理解するための最初のステップです。 だから中毒とは何ですか? たとえば、内部でDragonsと呼ばれる別のクラスまたはインターフェイスを使用するTargaryensクラスがあります。 したがって、 TargaryensクラスはDragonsクラスまたはインターフェイスに依存します。

GIF


つまり、 TargaryensクラスはDragonsなしでは機能しません。 これは、 Targaryensクラスが使用される場所はどこでもDragonsクラスが存在することを意味します。つまり、 Dragonsを再利用せずにTargaryensを再利用することはできません。 この場合、 Targaryensは依存クラスであり、 Dragonsは依存クラスです。 扶養家族は彼の依存に依存しています。

互いに使用する2つのクラスは'coupled'と呼ばれます。 クラス間の関係は、強い( 'tight' )または弱い( 'loose' )のいずれかです。 依存関係は常に指示されます。つまり、 TargaryensクラスはDragonsに依存しますが、 DragonsクラスはTargaryensクラスに依存しない場合があります。

 class Targaryens { public Targaryens() { // ,    Targaryens,     Dragons Dragons dragons = new Dragons(); dragons.callForWar(); } } 

中毒が悪いのはなぜですか?


クラス内の多数の依存関係は、次の理由により悪い依存関係の問題につながります。


#再利用再利用可能性)


クラスとメソッドが疎結合、無関係、または他の多くの要素と独立している場合、コードを再利用する可能性が高まります。 コードの再利用は、オブジェクト指向プログラミングの基本的な考え方の1つです。

#テスト


テストのために、特定のオブジェクトを置換( モック )できます。 ただし、クラスまたはメソッドに多くの依存関係がある場合、テストは困難になります。 Javaクラス(たとえば、 Targaryens )がnew演算子を介して別のクラス( Dragons )のインスタンスを作成する場合、このクラス( Targaryens )は、 newDragons )演算子を介して作成されたクラスに関係なくテストできません。

#サポート性


コードを正しくテストできない場合、その部分は不可能または再利用が困難であり、プロジェクトは成長し続け、プロジェクトの維持は非常に困難になります。 サポートは他の多くの要因に依存しますが、チームの新しい開発者はシステムを理解し、同僚をより快適にしますが、プロジェクトは引き続きサポートされます。

依存関係の種類


依存関係には多くの種類がありますが、主なものは区別できます。


#クラスに依存


前にクラスの依存関係の例を見てきました。 Targaryensクラスのコンストラクタは、 Dragonsクラスに依存するか、 callForWar()メソッドを呼び出す必要があります。

#インターフェイスに依存


executePlanメソッドは、 WarStrategyインターフェースを依存関係として受け入れます。 WarStrategyは、すべての家(Targaryens、Starks、Lannistersなど)で実装できます。

 public Result executePlan(WarStrategy strategy) { //WarStrategy    } 

#メソッドまたはフィールドへの依存


次のメソッドはHouseClassオブジェクトを受け取り、それがgetKing()メソッドは依存関係であり、メソッドシグネチャで識別できません。

 public String extractName(HouseClass house) { return house.getKing(); //     } 

#直接および間接の依存関係


別の例を見てみましょう。 Targaryensクラスは、玉座を征服する際にStarksクラスに依存しています。 しかし、 Starksは北のその他の王国、例えばStarks依存しています。 したがって、 Targaryens Starks直接依存し、間接的にMormont依存していることがMormontます。

まとめ


Javaクラスがnew演算子を介して別のクラスのインスタンスを作成する場合、このクラスはnew演算子を介して作成されるクラスとは無関係に使用またはテストできません。 これは中毒と呼ばれます。

依存関係は、コードの再利用の可能性を減らし、テストプロセスを複雑にし、プロジェクトの維持をより困難にするという点で悪いです。

依存関係には、クラス、インターフェイス、メソッド、フィールド、直接、間接など、さまざまなタイプがあります。

次は?


次の記事では、 ハードな依存関係の問題を解決する方法について説明します。もちろん、依存関係の挿入は正解です。 実際の例を考えて、強いつながりを見つけて分析してください。

Source: https://habr.com/ru/post/J343248/


All Articles