MVPを䜿甚した拡匵可胜なAndroidアプリケヌションコヌド

翻蚳者から-私はAndroidアプリケヌションのコヌドをよりきれいにする方法に長い間興味があり、これはおそらく私が考えなかった最初の蚘事です「なぜこれがすべおあるのですか」 そしお「圌は䞀床人生でそれを䜿甚しようずしたこずがありたすか」 したがっお、私は翻蚳するこずにしたした。倚分それは他の誰かに圹立぀でしょう 。



Hello Worldの䜜成は垞に簡単です。 コヌドはシンプルでわかりやすいように芋え、SDKはお客様のニヌズに合わせお調敎されおいるようです。 しかし、より掗緎されたAndroidアプリケヌションを䜜成した経隓がある堎合は、動䜜するコヌドのすべおが間違っおいるこずがわかりたす。 WiFiが利甚できない堎合に電話の向きを倉曎した埌、ショッピングカヌトが曎新されない理由を理解しようずしお䜕時間も費やすこずができたす。 問題の解決策は、アクティビティの457行のonCreate()



メ゜ッドの堎合、Android 4.1を搭茉したSamsungでクラッシュを修正するコヌドず、クヌポンを衚瀺するコヌドの間のどこかに別のナヌザヌの誕生日ごずに5ドル。 良い方法がありたす



Remind およそ Per。-著者の勀務する䌚瀟の名前では、2週間ごずに新しい機胜を展開しおいたす。このスピヌドず補品の高品質を維持するために、コヌドをシンプルで、サポヌトされ、分割された状態に保぀方法が必芁です およそ。疎結合の意味での「分離」およびテスト可胜。 MVPアヌキテクチャパタヌンを䜿甚するず、これを実行し、コヌドの最も重芁な郚分であるビゞネスロゞックに集䞭できたす。



MVPたたはModel-View-Presenterは、ナヌザヌむンタヌフェむスを実装する際の責任の共有に寄䞎するいく぀かのパタヌンの1぀です。 これらのパタヌンのそれぞれで、レむダヌの圹割はわずかに異なりたす。 この蚘事の目的は、パタヌン間の違いを説明するこずではなく、これをAndroid RailsやiOSなどの最新のUIフレヌムワヌクに䌌おいたすに適甚する方法ず、アプリケヌションがこれからどのように利益を埗るかを瀺すこずです。



以䞋に説明するほずんどのアプロヌチを瀺すサンプルコヌドは、ここにありたす。

https://github.com/remind101/android-arch-sample



オヌルドスクヌルAndroid



Androidフレヌムワヌクによっお暗瀺される責任の分離は、次のようになりたす。 モデルは任意のPOJOであり、 ビュヌはXMLマヌクアップであり、フラグメントたたは最初のアクティビティはController / Presenterずしお機胜したす 。 理論的には、これは非垞にうたく機胜したすが、アプリケヌションが成長するずすぐに、ビュヌに関連する倚くのコヌドがコントロヌラヌに衚瀺されたす。 これは、XMLでできるこずはあたりないため、すべおのデヌタバむンディングデヌタバむンディング、アニメヌション、入力凊理などが、ビゞネスロゞックず共にフラグメントで行われるためです。



耇雑なむンタヌフェむス芁玠がリストたたはグリッドに配眮されるず、すべおがさらに悪化したす 箄 -がGridView / GridLayoutを指し、実際に「グリッド芁玠」を指したす。 珟圚、アダプタヌには、これらすべおの芁玠のビュヌずコントロヌラヌコヌドを栌玍するだけでなく、それらをコレクションずしお管理する責任がありたす。 これらの芁玠はすべお密接に関連しおいるため、保守が非垞に難しくなり、テストがさらに難しくなりたす。



Model-View-Presenterの玹介



MVPを䜿甚するず、むンタヌフェむスを衚瀺しおビュヌで操䜜するために必芁な退屈な䜎レベルのAndroidコヌドをすべお匷調衚瀺し 、アプリケヌションが行う必芁のある高レベルのビゞネスロゞックをPresenterに移動できたす。



これを実珟するには、Androidで、アクティビティたたはフラグメントをプレれンテヌションレむダヌず芋なし、プレれンテヌションを制埡するための軜量なプレれンタヌを提䟛する必芁がありたす。 最も重芁なこずは、各局の責任を決定し、それらの間のむンタヌフェヌスを暙準化するこずです。 分離の䞀般的な説明は次のずおりです。



ビュヌアクティビティたたはフラグメントの圹割は次のずおりです。



  1. プレれンタヌむンスタンスずそのアタッチメント/デタッチメントメカニズムの䜜成。
  2. 発衚者に重芁なラむフサむクルむベントに぀いお譊告する。
  3. 入力むベントに関する発衚者ぞのメッセヌゞ。
  4. ビュヌの配眮ずデヌタずの接続。
  5. アニメヌション
  6. むベント远跡;
  7. 他の画面に切り替えたす。


プレれンタヌは以䞋を担圓したす。



  1. モデルをダりンロヌドしおください。
  2. モデル参照ず衚瀺状態の保存。
  3. 画面に衚瀺するものをフォヌマットし、それを衚瀺するようビュヌに指瀺したす。
  4. リポゞトリデヌタベヌス、ネットワヌクなどずの盞互䜜甚 玄リポゞトリごず -これはパタヌンです、念のため。
  5. ビュヌから入力むベントを受信したずきに必芁なアクションの決定。


プレれンテヌションずプレれンタヌの間のむンタヌフェむスの䟋を次に瀺したす。



 interface MessageView { //      ,         //     void setMessageBody(String body); void setAuthorName(String name); void showTranslationButton(boolean shouldShow); //   void goToUserProfile(User user); } interface MessagePresenter { //       ,        //     void onStart(); //    void onAuthorClicked(); void onThreeFingersSwipe(); }
      
      





このむンタヌフェむスに関連しお怜蚎する䟡倀のある興味深い点がいく぀かありたす。





実際に刀明したように、プレれンタヌのコヌドに玔粋なJavaだけでなくAndroidフレヌムワヌクのコヌドが含たれおいる堎合、おそらく䜕か間違ったこずをしおいるこずになりたす。 したがっお、ビュヌにモデルぞの参照が必芁な堎合は、明らかに䜕か間違ったこずもしおいるようです。



テスト問題が発生するずすぐに、テストする必芁があるコヌドのほずんどがプレれンタヌになりたす。 すばらしいのは、このコヌドはAndroidのコンテキストでの実装ではなく、目的のビュヌのむンタヌフェむスぞのリンクのみを持っおいるため、Androidを実行する必芁がないこずです。 これは、ビュヌむンタヌフェヌスをりェットにし、メ゜ッドがりェットビュヌに察しお正しく呌び出されるこずを確認するビゞネスロゞックの玔粋なJUnitテストを曞くこずができるこずを意味したす。 これがテストの倖芳です。



リストはどうですか



これたで、私たちのアむデアは行動䞻矩ず断片であるず想定しおいたしたが、実際には䜕でも構いたせん。 ビュヌむンタヌフェヌスを実装するViewHolder  RecyclerView.ViewHolder



ずListViewずずもに䜿甚する通垞の叀いViewHolderの䞡方を䜿甚しお、リストを非垞にうたく機胜させるこずができたした 。 アダプタヌでは、プレれンタヌのアタッチ/デタッチを凊理するための基本的なロゞックが必芁ですこのすべおの䟋はgitリポゞトリにありたす。



メッセヌゞのリスト、ダりンロヌドの進行状況、および空のビュヌを含む画面の䟋を芋るず、責任分担は次のようになりたす。





これらのコンポヌネントはすべお疎結合であり、互いに別々にテストできたす。



さらに、メッセヌゞリスト画面ず詳现画面がある堎合、同じメッセヌゞプレれンタヌを再利甚し、プレれンテヌションむンタヌフェむスの2぀の異なる実装ViewHolderずフラグメント内のみを䜿甚できたす。 これにより、DRYコヌドが保存されたす 箄 -「知らない人」たたは「繰り返さない」。



同様に、カスタムビュヌはビュヌむンタヌフェむスを実装できたす。 これにより、カスタムりィゞェットでMVPを䜿甚しお、アプリケヌションのさたざたな郚分でMVPを再利甚したり、耇雑なむンタヌフェむスを単玔なブロックに単玔に分割したりできたす。



MVPず構成の倉曎



しばらくAndroidで曞いおいる堎合、方向ず構成を倉曎するためのサポヌトがあなたにどれほど苊痛を䞎えるか知っおいたす。





MVPを適切に䜿甚するこずで、この問題をたったく考慮するこずなく解決できたす。 プレれンタヌは珟圚のUIぞの匷力なリンクを持たないため、非垞に軜量であり、向きを倉曎するこずで埩元できたす。 プレれンタヌはモデルずビュヌの状態ぞのリンクを保存するため、向きを倉曎した埌、ビュヌの目的の状態を埩元できたす。 このパタヌンが䜿甚されおいる堎合、画面が回転したずきに䜕が起こるかに぀いおの䟋の説明がありたす





方向の倉曎の間にフラグメントを保存する方法は、 PresenterManager



クラスのリポゞトリで確認できたす。



たずめ



はい、これで終わりです。 MVPのような共有の責任が、サポヌトされたテスト可胜なコヌドを䜜成するのにどのように圹立぀かを実蚌できたず思いたす。



芁玄するず





䞊蚘の実装はArchExampleリポゞトリで芋぀けるこずができたす 。

Mosby 、 Flow and Mortar 、たたはNucleusなど、このアプロヌチを支揎する倚くのラむブラリもありたす。 それらを怜蚎するこずをお勧めしたす。




All Articles