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:
Im ersten Teil dieses Tutorials konzentrieren wir uns auf die Theorie des MVP-Musters. Der zweite Teil dieses Tutorials ist praktischer.
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.
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:
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?
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:
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:
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 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.
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.
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.
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.