Android MVP Muster Paketstruktur

Ich sah verschiedene große Tutorials auf MVP-Muster in Android, aber die Autoren scheinen alle anderen Praxis auf Verpackung zu haben.

Das erste Tutorium, das ich gesehen habe, hat die Verpackung durch Funktionalitäten gemacht. Wie "Login", "Join", "UI" Paket.

  • Jar Mismatch! Fix deine Abhängigkeiten für die FacebookSDK
  • Wie kann ich einen Singleton (Shared) Service in einer Bibliothek für mehrere Anwendungen ausführen?
  • Top-most und Bottom-most Horizonal Divider erscheint nicht in ListView
  • Android - wie man eine Item-Klick-Methode zu einem ArrayAdapter hinzufügt
  • Android SDK Manager Extras
  • Android Change Navigation Ansicht Menü Hintergrund
  • Das UI-Paket hat nur Aktivitäten, das "Login" -Paket hat die Schnittstellen für den Moderator und den konkreten Moderator, und dieses Paket enthält ein Subpaket "Model", das alles über das Login-Modell (Kommunikation mit dem Server) enthält. Das "Join" -Paket hat die gleiche Komposition wie das "Login" -Paket.

    Aber die andere, die ich gesehen habe, hat die Verpackung von der Szene, wie "Join", "Login".

    "Join" -Paket enthält eine Aktivität und drei Subpakete mit dem Namen "Model", "View", "Presenter".

    Was ist die beste Praxis? Gibt es irgendwelche Artikel, die dieses Problem behandeln?

  • Veröffentlichen Sie Android App mit Bestenlisten und keine Errungenschaften
  • Wie kann ich die Benachrichtigung löschen
  • Kleinste Breite für Galaxy S und Galaxy S2
  • LocalSocket-Kommunikation mit Unix Domain in Android NDK
  • SQLite-Datenbank, Multithreading, Sperren und Account-Synchronisierung auf Android
  • Zugriff auf Google Talk Chat Geschichte
  • 3 Solutions collect form web for “Android MVP Muster Paketstruktur”

    Ich leite hier nur meine Antwort

    Ich stelle oft Business-Logik-Code in Model Layer (keine Verwirrung mit Modell in der Datenbank). Ich XManager mich oft als XManager zur Vermeidung von Verwirrung (wie ProductManager , MediaManager …), so dass die Präsentationsklasse nur für den Workflow verwendet wird.

    Die Faustregel ist nein oder zumindest begrenzen Import-android-Paket in der Präsentationsklasse. Diese Best Practice unterstützt Sie leichter in der Prüfer-Präsentation Klasse, weil Moderator ist jetzt nur eine einfache Java-Klasse, so dass wir nicht brauchen Android-Framework für die Prüfung dieser Dinge.

    Zum Beispiel ist hier mein mvp-Workflow.

    View-Klasse : Dies ist ein Ort, an dem Sie alle Ihre Ansicht wie Button, Textansicht speichern … und Sie alle Zuhörer für diese View-Komponenten auf dieser Ebene setzen. Auch auf dieser Ansicht definieren Sie eine Listener-Klasse für Moderator-Implementierungen später. Ihre View-Komponenten rufen Methoden zu dieser Zuhörerklasse auf.

     class ViewImpl implements View { Button playButton; ViewListener listener; public ViewImpl(ViewListener listener) { // find all view this.listener = listener; playButton.setOnClickListener(new View.OnClickListener() { listener.playSong(); }); } public interface ViewListener { playSong(); } } 

    Presenter-Klasse: Hier speichern Sie die Ansicht und das Modell für den späteren Aufruf. Auch die Präsentationsklasse implementiert die ViewListener-Schnittstelle. Hauptpunkt des Moderators ist der Steuerlogik-Workflow.

     class PresenterImpl extends Presenter implements ViewListener { private View view; private MediaManager mediaManager; public PresenterImpl(View, MediaManager manager) { this.view = view; this.manager = manager; } @Override public void playSong() { mediaManager.playMedia(); } } 

    Manager-Klasse: Hier ist die Kern-Business-Logik-Code. Vielleicht wird ein Moderator viele Manager haben (abhängig davon, wie kompliziert die Ansicht ist). Oft bekommen wir Context Klasse durch einige Injektion Framework wie Dagger .

     Class MediaManagerImpl extends MediaManager { // using Dagger for injection context if you want @Inject private Context context; private MediaPlayer mediaPlayer; // dagger solution public MediaPlayerManagerImpl() { this.mediaPlayer = new MediaPlayer(context); } // no dagger solution public MediaPlayerManagerImpl(Context context) { this.context = context; this.mediaPlayer = new MediaPlayer(context); } public void playMedia() { mediaPlayer.play(); } public void stopMedia() { mediaPlayer.stop(); } } 

    Schließlich: Setzen Sie das Ding zusammen in Aktivitäten, Fragmente … Hier ist der Ort, den Sie initialisieren Ansicht, Manager und ordnen alle zu Moderator.

     public class MyActivity extends Activity { Presenter presenter; @Override public void onCreate() { super.onCreate(); IView view = new ViewImpl(); MediaManager manager = new MediaManagerImpl(this.getApplicationContext()); // or this. if you use Dagger MediaManager manager = new MediaManagerImpl(); presenter = new PresenterImpl(view, manager); } @Override public void onStop() { super.onStop(); presenter.onStop(); } } 

    Sie sehen, dass jeder Moderator, Modell, Ansicht von einer Schnittstelle gewickelt wird. Diese Komponenten werden über die Schnittstelle aufgerufen. Dieses Design wird Ihren Code robuster und einfacher für die Änderung später.

    App sollte Paket nach features nicht durch die gemeinsame Funktionalität haben.

    Ich finde Menschen machen Aktivität, Fragmente, Adapter, etc. Gemeinsame Zweck Paket in einer Gruppe, aber das ist schlechte Praxis !

    Die meisten Entwickler gruppieren sie so, weil sie dies tun, um die gleiche Paketstruktur für alle Anwendungen zu halten, an denen sie arbeiten . Aber das ist sehr falsche Entscheidung, denn es ist immer schwer, Klassen zu finden, wenn sie nur gruppiert sind, weil sie dieselben Elternklassen teilen!

    Wir sollten die Klassen nach den übergeordneten Klassen gruppieren, aber nur, wenn wir irgendeine API machen, aber wenn wir ein kundenspezifisches Produkt für unseren Klienten machen, dann ist es sehr schlechte Praxis.

    Wie alle Aktivitäten, die die meisten Entwickler in das Aktivitätspaket setzen, weil alle Aktivitätsklassen die Aktivitätsklasse erweitern. Das macht Sinn, dass dies nur ein aktivitätsbezogenes Paket ist, aber es ist schwer, diese Pakete zu durchlaufen.

    Angenommen, wir haben eine OrderListActivity-Klasse und wir holen die Auftragsliste vom Server ab und zeigen sie dann in einer OrderListFragment-Klasse an, und offensichtlich benötigen wir OrderListAdapter, um die Auftragsliste anzuzeigen. Also, wenn der Kunde um eine Änderung oder irgendeine Funktion bittet, die er auf diesem Auftragsliste-Bildschirm wünscht, müssen wir zu vielen Paketen gehen, um Kundenbedarf zu befriedigen. Wie wir zum Aktivitätspaket gehen und etwas in OrderListActivity ändern und dann zu OrderListFragment gehen und dann OrderListAdapter und dann OrderListViewHolder etc.! So wird das zu hart und wir können Probleme beim Ändern!

    So sollten wir die Klassen zusammenfassen, die sich ändern / ändern.

    Das ist die beste Praxis und so sollten wir alle Klassen gruppieren, die für das OrderListing-Feature in einem Paket verantwortlich sind und wir nennen es Bestell-Paket.

    Bitte überprüfen Sie meine mittlere Post Ich habe die Paketstruktur auch dazu erklärt: –

    https://medium.com/@kailash09dabhi/mvp-with-better-naming-of-implementation-classes-dry-principle-e8b6130bbd02

    Die gute Praxis ist es, Stoffe durch Feature (manchmal als Modul) und Schicht, nicht durch ihre Rolle zu trennen. Grund: Klasse / Schnittstellenname hat bereits gesagt, dass zB LoginView, LoginPresenter, LoginFragment, LoginActivity etc.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.