Eine Einführung in Model View Presenter auf Android

Wenn wir eine komplexe Anwendung entwickeln, stoßen wir im Allgemeinen auf Herausforderungen, die wahrscheinlich früher angegangen wurden und die bereits einige großartige Lösungen bieten. Solche Lösungen werden oft als Muster bezeichnet. Im Allgemeinen sprechen wir über Designmuster und Architekturmuster. Sie vereinfachen die Entwicklung, und wir sollten sie verwenden, wann immer es angebracht ist, sie zu verwenden.

Dieses Tutorial soll Ihnen helfen zu verstehen, wie wichtig ein gut entworfenes Projekt ist und warum die Standardarchitektur von Android nicht immer ausreicht. Wir besprechen einige potenzielle Probleme, die bei der Entwicklung von Android-Anwendungen auftreten können, und ich zeige Ihnen, wie Sie diese Probleme lösen können, indem Sie die Testbarkeit und Zuverlässigkeit der App verbessern Model View Presenter (MVP) -Muster.

In diesem Lernprogramm untersuchen wir:

  • der Wert der Anwendung bekannter Architekturmuster in Softwareprojekten
  • Warum es eine gute Idee sein kann, die Standardarchitektur von Android zu ändern
  • Die Schlüsselkonzepte des Model View Presenter (MVP) -Musters
  • die Unterschiede zwischen MVC und MVP
  • wie MVP in das Android SDK passt

Im ersten Teil dieses Tutorials konzentrieren wir uns auf die Theorie des MVP-Musters. Der zweite Teil dieses Tutorials ist praktischer.

1. Android-Architektur

Die Gestaltung eines Projekts sollte von Anfang an ein Anliegen sein. Eines der ersten Dinge, die wir berücksichtigen sollten, ist die Architektur, die wir übernehmen möchten, da sie bestimmt, wie verschiedene Elemente unserer Anwendung miteinander in Beziehung stehen. Es wird auch einige Grundregeln aufstellen, die uns während der Entwicklung leiten sollen.

Im Allgemeinen erwartet ein Framework oder SDK, dass die Dinge auf eine bestimmte Art und Weise erledigt werden, aber dies ist nicht immer die richtige für ein Projekt. Manchmal gibt es keine vordefinierte oder korrekte Vorgehensweise, und die Konstruktionsentscheidung bleibt dem Entwickler überlassen. Das Android SDK erwartet, dass die Dinge auf eine bestimmte Art und Weise erledigt werden, aber das ist nicht immer ausreichend oder die beste Wahl.

Obwohl Android ein hervorragendes SDK bietet, sind seine Architekturmuster recht ungewöhnlich und können während der Entwicklung leicht in Ihre Wege treten, insbesondere wenn komplexe Anwendungen erstellt werden, die lange getestet und gewartet werden müssen. Glücklicherweise können wir aus mehreren Architekturlösungen wählen, um dieses Problem zu lösen.

Worin besteht das Problem?

Das ist eine knifflige Frage. Einige könnten sagen, dass es keine Probleme mit der von Android angebotenen Architektur gibt. Sicher, es erledigt die Arbeit. Aber können wir es besser machen? Ich glaube fest daran, dass wir das können.

Die von Android angebotenen Tools mit Layouts, Aktivitäten und Datenstrukturen scheinen uns in die Richtung des Model View Controller (MVC) -Musters zu lenken. MVC ist ein solides, etabliertes Muster, das darauf abzielt, die verschiedenen Rollen einer Anwendung zu isolieren. Dies wird als Trennung der Bedenken bezeichnet.

Diese Architektur erstellt drei Ebenen:

  • Modell
  • Aussicht
  • Regler

Jede Ebene ist für einen Aspekt der App verantwortlich. Modell reagiert auf Geschäftslogik, Aussicht ist die Benutzeroberfläche und Regler vermittelt Aussicht Zugriff auf Modell.

Aber wenn wir die Architektur von Android genau analysieren, insbesondere die Beziehung zwischen Aussicht (Aktivitäten, Fragmente usw.) und Modell (Datenstrukturen) können wir daraus schließen, dass es nicht als MVC betrachtet werden kann. Es unterscheidet sich stark von MVC und folgt seinen eigenen Regeln. Es kann Ihnen sicherlich im Weg stehen, wenn Sie die bestmögliche Anwendung erstellen möchten.

Genauer gesagt: Wenn wir über die symbiotische Verbindung zwischen Ladern und Aktivitäten oder Fragmenten nachdenken, können Sie verstehen, warum wir die Architektur von Android genau beachten sollten. Eine Aktivität oder ein Fragment ist für den Aufruf des Loader verantwortlich, der Daten abrufen und an das übergeordnete Element zurückgeben soll. Seine Existenz ist vollständig an das übergeordnete Element gebunden, und es gibt keine Trennung zwischen der Ansichtsrolle (Aktivität / Fragment) und der vom Loader ausgeführten Geschäftslogik.

Wie können wir Unit-Tests in einer Anwendung verwenden, in der Daten (Loader) so eng mit der Ansicht (Aktivität oder Fragment) gekoppelt sind, wenn das Testen von Einheiten das kleinste mögliche Codeteil ist? Wenn Sie in einem Team arbeiten und etwas im Code einer anderen Person ändern müssen, wie können Sie das Problem finden, wenn das Projekt nicht an einem bekannten architektonischen Muster festhält und alles buchstäblich irgendwo anders sein könnte?

Was ist die Lösung?

Wir können dieses Problem lösen, indem wir ein anderes Architekturmuster implementieren. Glücklicherweise ermöglicht das Android SDK die Wahl zwischen mehreren Lösungen. Wir können unsere Optionen auf Lösungen beschränken, die für Android am besten geeignet sind. Das Model View Controller (MVC) -Muster ist eine gute Wahl, aber noch besser ist das eng verwandte Model View Presenter (MVP) -Muster. MVP wurde unter den gleichen Voraussetzungen wie MVC entwickelt, jedoch mit einem moderneren Paradigma, das eine noch bessere Trennung der Anliegen schafft und die Testbarkeit der Anwendung maximiert.

In Anbetracht der Architektur von Android (oder einer fehlenden Architektur) können wir Folgendes schließen:

  • Android macht sich nicht allzu viele Sorgen um eine Trennung der Bedenken
  • Es ist am besten, die Architektur von Android so zu belassen, wie sie ist, da dies in der Zukunft zu Problemen führen kann
  • Das Fehlen eines geeigneten architektonischen Musters könnte die Prüfung der Einheiten zu einer echten Qual machen
  • Bei Android können wir zwischen verschiedenen alternativen Architekturmustern wählen
  • Model View Presenter (MVP) ist eine der besten Lösungen für Android

2. Model View Presenter auf Android

Wie bereits erwähnt, ist die Trennung von Bedenken nicht der stärkste Punkt von Android. Glücklicherweise verbessert das Model View Presenter-Muster dies deutlich. MVP teilt die Anwendung in drei Schichten auf:

  • Modell
  • Aussicht
  • Moderator

Jeder hat seine Verantwortlichkeiten und die Kommunikation zwischen diesen Schichten wird vom Präsentator verwaltet. Der Presenter arbeitet als Vermittler zwischen den verschiedenen Teilen.

  • Das Modell enthält die Geschäftslogik der Anwendung. Sie steuert, wie Daten erstellt, gespeichert und geändert werden können.
  • Die Ansicht ist eine passive Schnittstelle, die Daten anzeigt und Benutzeraktionen an den Presenter weiterleitet.
  • Der Presenter ist der mittlere Mann. Es ruft Daten aus dem Modell ab und zeigt sie in der Ansicht. Sie verarbeitet auch Benutzeraktionen, die von der View an sie weitergeleitet wurden.

Unterschiede zwischen MVC und MVP

Das Model View Presenter-Muster basiert auf dem Model View Controller-Muster. Da sie mehrere Konzepte gemeinsam haben, kann es schwierig sein, sie zu unterscheiden. Der Presenter und der Controller haben eine ähnliche Rolle. Sie sind für die Kommunikation zwischen Model und View verantwortlich. Der Controller verwaltet Model und View jedoch nicht so streng wie der Presenter.

Im MVC-Muster ist die Ansichtsebene etwas intelligent und kann Daten direkt vom Modell abrufen. Im MVP-Muster ist die Ansicht vollständig passiv, und der Presenter liefert immer Daten an die Ansicht. Controller in MVC können auch von mehreren Ansichten gemeinsam genutzt werden. In MVP haben View und Presenter eine Eins-zu-Eins-Beziehung. Daher ist der Presenter an eine View gebunden.

  • In MVP kann die Ansicht nicht auf das Modell zugreifen.
  • Der Presenter ist an eine einzelne Ansicht gebunden.
  • Die Ansicht ist im MVP-Muster vollständig passiv.

Diese konzeptionellen Unterschiede sorgen dafür, dass das MVP-Muster eine bessere Trennung der Bedenken gewährleistet und auch die Testbarkeit der Anwendung erheblich verbessert, indem eine größere Trennung der drei Kernschichten gefördert wird.

Aktivitäts-, Fragment- und Ansichtsobjekte

Es gibt verschiedene Interpretationen, wie MVP auf Android implementiert werden kann. Im Allgemeinen erhalten Aktivitäten und Fragmente jedoch die Rolle "Ansicht" und sind für die Erstellung des Präsentators und des Modells verantwortlich. Die Ansicht ist auch für die Pflege des Modells und des Presenters zwischen Konfigurationsänderungen verantwortlich und informiert sie über die eventuelle Zerstörung der Ansicht.

Andere Ansichtsobjekte, wie z. B. RecyclerView, können auch als Teil der Ansichtsebene in MVP betrachtet werden. Es gibt eine Eins-zu-Eins-Beziehung zwischen der Ansicht und dem Präsentator, und manchmal können komplexe Situationen nach mehreren Präsentatoren verlangen.

Was wir bisher wissen

  • Durch die Verwendung von Architektur- und Designmustern können wir die Entwicklung wesentlich einfacher und transparenter gestalten.
  • Android hat kein gut strukturiertes architektonisches Muster.
  • Ohne die Verwendung etablierter Entwurfsmuster können auf dem Weg eine Reihe von Schwierigkeiten auftreten, insbesondere Probleme in Bezug auf die Wartbarkeit und Testbarkeit.
  • Das Model-View-Presenter-Muster erhöht die Trennung von Anliegen und erleichtert das Testen von Einheiten.
  • Der Präsentator vermittelt die Kommunikation zwischen Ansicht und Modell.
  • Die Ansicht zeigt Daten an und leitet die Benutzerinteraktion an den Presenter weiter.
  • Das Modell ist für die Geschäftslogik der Anwendung verantwortlich.
  • Die Ansichtsrolle wird meistens von einer Aktivität oder einem Fragment übernommen.

Fazit

Im nächsten Lernprogramm implementieren wir das Model View Presenter-Muster unter Android. Wir haben die Konzepte, die wir in diesem Tutorial gelernt haben, getestet und die Komplexität des Musters und die Bedeutung von Android für Android genauer untersucht.

Am Ende dieser Serie können Sie MVP in Ihren eigenen Projekten implementieren, ein eigenes Framework erstellen oder andere bekannte Lösungen übernehmen. Ich hoffe, wir sehen uns im nächsten Tutorial.