Ist das MVP-Schema (Model-View-Presenter) für Android nützlich?

34

So trennen Sie View und Presenter in Android, während die Reaktionen auf die Benutzeraktionen (Presenter-Teil von MVP) in denselben Aktivitäten festgelegt werden, in denen GUI-Elemente angezeigt werden (View-Teil von MVP).

"In Model View Presenter, wie Martin Fowler oder Michael Feathers [2] sagen, ist die Logik der Benutzeroberfläche in eine Klasse namens Presenter unterteilt, die alle Eingaben des Benutzers verarbeitet und der" dummen "Ansicht mitteilt, was und wann zu tun ist Anzeige "(zitiert von hier ).

Bis jetzt dachte ich, dass eine der Hauptfunktionen von Android die intelligente Aktivität ist, die Aktionen ausführt, auf diese reagiert und die Ergebnisse anzeigt. Steht das MVP-Schema im Widerspruch zur Android-Philosophie? Hat es Sinn zu versuchen, es auf Android zu realisieren? Wenn ja, wie könnte das geschehen?

Gangnus
quelle
2
+1 Gute Frage, weil ich MVP / MVVM in Android-App-Quellen noch nicht gesehen habe. Es wäre interessant zu sehen, MVP-Android-Beispiele und wie viel Code / Lib-Overhead sie produzieren. Dieses Problem wurde nicht bei Stackoverflow empfohlenen Methoden zur Herstellung von tragbaren
Apps
Vielleicht könnte ich es in Stackoverflow setzen, oder wäre es gegen Regeln?
Gangnus
Sie können einen der Administratoren bitten, diese Frage zu migrieren, anstatt die Frage zu duplizieren. Hier auf programmersden Fragen sind kontroverse Frage "Was denkst du über ../ist es gut oder schlecht zu ...", während stackoverfloweher wie "Gibt es Beispiele für MVP in Android" sein würde. Für mich sind beide Orte ok.
k3b
Es tut mir so leid für meine Unglück, aber bis jetzt habe ich keine Möglichkeit gefunden, eine Verbindung zu Administratoren herzustellen :-(
Gangnus
Diese Frage ist NICHT für den Stapelüberlauf geeignet. Übrigens - Sie können die Moderatoren kontaktieren, indem Sie Ihren Beitrag über den Link "Flagge" markieren.
ChrisF

Antworten:

15

Android-Anwendungen basieren im Wesentlichen auf Model-View-Controller (MVC) - MVP klingt genauso, obwohl ich den Begriff vorher noch nicht gehört habe. Aktivitäten die Rolle des Controllers zu füllen, sind XML - Ansichten nur , dass (obwohl Sie können sie programmatisch in der Aktivität bauen - es ist einfach leichter und einfacher es in XML zu tun), und das Modell Sie selbst schreiben. Also ja, dieses Modell ist ziemlich praktisch.

Ein möglicher Grund, warum Sie nicht viel über dieses Designmodell gehört haben, ist, dass das Android-Framework Sie dazu zwingt, die Ansicht zu trennen. Da die Anwendung auf Mobilgeräten in der Regel klein ist, wird Full-On-MVC in der Regel nicht verwendet. Sie tendieren zu Ansichts- und Aktionsebenen, in denen die Aktionsebene einen Großteil der (kleinen) Arbeit des Modells erledigt.

Wenn Sie eine plattformübergreifende App schreiben, sollten Sie sich einen Ansatz mit vier Ebenen ansehen: Ansicht, Aktion, Geschäftslogik und Modell. Die Ebenen "Ansicht" und "Aktion" sind plattformspezifisch, während sich die Geschäftslogik und das Geschäftsmodell nicht ändern. Grundsätzlich teilen Sie die Präsentator- und Benutzerinteraktion auf die Aktionsebene auf, die die Business Logic-Ebene aufruft, um die vom Benutzer gewünschte Aktion auszuführen.

Michael K
quelle
+1! Könnten Sie bitte ein oder zwei Hinweise auf einige gute Texte dazu geben?
Gangnus
4
Ich dachte, MVP bietet Ihnen die Möglichkeit, die Action(= Presentation) Layer-Plattform auch unabhängig zu halten - zumindest, wenn Ihre verschiedenen Plattformen ähnliche UI-Funktionen bieten.
Doc Brown
@ DocBrown In der Theorie ja. In der Praxis bin ich mir nicht sicher, ob dies jemals möglich sein wird, da Benutzerinteraktionen entweder die Ansicht oder den Präsentator treffen könnten. Beispielsweise werden in Android Wischvorgänge von der Aktivität behandelt, auf Webseiten jedoch von der Ansicht (Browser).
Michael K
12
"Android-Anwendungen basieren im Wesentlichen auf Model-View-Controller" - das ist auf so vielen Ebenen einfach falsch, tut mir leid. Die Android-Framework-Architektur basiert auf Gott-Klassen, in denen die View / Controller-Logik unübersichtlich ist.
Igor Filippov
2
Ich wünschte, ich könnte @ IgorFilippovs Kommentar mehr als nur einmal positiv bewerten. Die Idee, dass Android-Apps MVC per Design implementieren, ist ein weit verbreitetes Missverständnis. Im Gegensatz zu iOS wird von Android keine GUI-Architektur erzwungen, die die Bedenken klar voneinander trennt und ein isoliertes, leicht testbares Modell ermöglicht. Sie müssen selbst eines bereitstellen, sei es MVP, MVC oder etwas anderes.
Piovezan
6

Ich habe keine Erfahrung mit Android-Programmierung, sehe aber keinen Grund, warum MVP weniger nützlich sein sollte als in jedem anderen ereignisgesteuerten Framework. Die ActivityKlasse unterscheidet sich nicht wesentlich von der Dialogoder Formin anderen Frameworks. Daher sollte es einfach sein, eine "Activitity Presenter" -Klasse für jede Activity-Unterklasse Ihrer Anwendung zu erstellen und die Kernlogik dort abzulegen.

An Ihre "Aktivität" gesendete Ereignisse müssen an Ihren Moderator delegiert werden. Wenn Ihr Moderator Ereignisse selbst senden oder andere systemabhängige Funktionen aufrufen möchte, muss Ihre Aktivität über die Schnittstelle, die er mit dem Moderator teilt, verwandte Funktionen bereitstellen. Aber das ist im Grunde das gleiche wie in jedem anderen GUI-Framework, das ich kenne.

Doc Brown
quelle
+1 Danke für deine Zeit. Aber wie Sie aus einer anderen Antwort sehen, wird in Android ein ähnliches, aber anderes Modell verwendet. "Ich habe 50 Jahre lang mit Prosa gesprochen und nichts davon gewusst!" Jetzt werde ich versuchen, die Unterschiede der Modelle zu betrachten.
Gangnus
4
@Gangnus: MVP ist eine spezielle Form von MVC, hier finden Sie weitere Informationen. Und ich bin mir ziemlich sicher, dass es sich nicht um "entweder MVC oder MVP" handelt. Aktivitäten können eine Form von "Controller" sein, sind jedoch plattformabhängig. Wenn Sie die Benutzeroberflächenlogik für jede Aktivität in eine plattformunabhängige Presenter-Klasse unterteilen, werden sie wahrscheinlich einfacher für den Komponententest und portabler.
Doc Brown
5

MVP ist definitiv nützlich für Android. Es hilft, Ihren Code zu organisieren und zu testen. Und das Beste daran ist, dass neue Leute, die Ihren Code lesen, den Code verstehen und Beiträge leisten können, sobald sie wissen, was wohin soll. Hier ist ein sehr hilfreicher Link, um MVP anhand von Beispielen zu verstehen .

Hier finden Sie eine kurze Erläuterung aller drei Komponenten von MVP

Aussicht

In Android MVP enthält eine Ansicht zwei Dinge: Aktivität - Android-Ressource Ansicht - Java-Oberfläche Aktivität Implementiert die Ansicht und injiziert sich selbst (Ansichtsoberfläche) in den Präsentator, sodass der Präsentator über die Ansichtsoberfläche mit der Aktivität kommunizieren kann. Die ersten drei Blöcke des Diagramms zeigen die Kommunikation zwischen View und The Presenter.

Moderator

Presenter fungiert als mittlere Ebene zwischen Ansicht und Daten / Modell. View (Activity) befiehlt dem Präsentator, etwas zu präsentieren, und der Präsentator entnimmt dann Daten aus der Datenbank / dem Modell und gibt die präsentierbare Form von Daten an View zurück. View sorgt dann dafür, dass diese Daten auf dem Bildschirm angezeigt werden. Und denken Sie daran, dass Presenter eine einfache Java-Klasse ist, die keine der Android-Komponenten enthalten sollte, da dies sonst den Unit-Test des Presenters erschwert.

Wenn Sie die Datenbank im Presenter verwenden möchten, legen Sie in der Aktivität eine Datenbankinstanz an und fügen Sie sie in den Presenter ein. Auf diese Weise können Sie die Datenbank während des Unit-Tests verspotten und die Geschäftslogik testen.

Modell

Modell in MVP ist nichts anderes als Ihre Datenquelle. View kommuniziert nicht direkt mit Daten, sondern befiehlt Presenter, Daten dafür zu verarbeiten und die Informationen zurückzugeben, die ohne weitere Änderungen angezeigt werden können.

Ajit Singh
quelle
1
Info ist nützlich, danke, aber es ist in einer schlechten Weise gegeben. Sie sollten nicht nur eine eigene Site zitieren, sondern hier auch Informationen angeben. Referenzantworten sind nicht erlaubt. Verwenden Sie stattdessen Kommentare. Ich melde es nicht nur wegen der nützlichen Informationen auf Ihrer Website. Bitte ändern Sie es in einen Kommentar oder geben Sie in die Antwort einige wichtige Informationen ein, die auf den Hauptteil der Frage antworten. Dann bekommst du sicher nicht nur mein Plus, sondern auch die Antwortprüfung.
Gangnus
@Gangnus Ich habe die erforderlichen Informationen in der Antwort angegeben, da der gesamte Inhalt die Antwort sehr groß macht.
Ajit Singh
1
Es gibt zwei Arten von MVP. Passive Ansicht (was Sie hier beschrieben haben) und Supervising Presenter, mit denen eine direkte Datenbindung der Ansicht zum Modell möglich ist (ähnlich wie bei MVVM und vielen Web-MVC-Frameworks).
RubberDuck