# JavaFX MVP



## Kababär (17. Jun 2016)

Hi, 

eigentlich programmiere ich aus Bequemlichkeit mit dem MVC Model.
Jetzt will ich aber doch die View etwas von der Logik abkapseln (vor allem weil nun auch eigene Threads ins Spiel kommen) und habe mal was vom MVP gehört und bin sehr davon angetan mit einem zusätzlichen Presenter, wobei das zwar in erster Linie mehr Komplexität und Schreibarbeit mit sich bringt, aber der Vorteil der Flexibilität gegenüber Anpassungen und vor allem Testen(!) macht das ganze doch wirklich sehr attraktiv.

Nur: Leider finde ich keine guten, anschaulichen Beispiele dafür.. 
Hat da jemand was von euch?


----------



## Jardcore (17. Jun 2016)

Habe mal gehört das MVP ein synonym für MVC ist 
Beides sind eh nur Richtlinien.
Hier mal die wohl am meisten verlinkten Quelle zu JavaFx und MVP:
http://afterburner.adam-bien.com/


----------



## Kababär (17. Jun 2016)

Ne es gibt einen wesentlichen Unterschied zwischen MVP und MVC. Früher haben wir mal kurz MVP gemacht, das habe ich aber nicht kapiert und nur Nullpointer bekommen, einen nach dem anderen.
Da hatten wir: View, Model, Presenter und Controller.


----------



## Kababär (17. Jun 2016)

Vorheriger Beitrag nicht mehr editierbar.

Wenn ich das richtig verstehe, handelt es sich bei diesem Afterburner um ein Framework. Ein Framework will ich aber nicht nutzen, sondern eher ein Verständnis und Beispiele sehen. Beispielsweise stellt sich für mich die Fragen, ob Listener im ViewController oder Presenter zu schreiben sind, etc.


----------



## nvidia (17. Jun 2016)

Hier http://www.wildcrest.com/Potel/Portfolio/mvp.pdf findest du den Originalartikel zum MVP. Mir ist bisher noch keine Implementierung untergekommen die dem folgt, die meisten sprechen von MVP und meinen eine Variation aus der MVC-Familie.


----------



## Kababär (17. Jun 2016)

Danke für den Link, wobei es bei diesem Link wohl so ist, dass die View und das Model eng verbunden sind. Allerdings ist die Idee beim MVP genau das der Kern, und zwar dass View und Model (nicht wie bei dem Controller) nur über einen Kommunikationspartner (dem Presenter) verbunden sind.
Mittlerweile bin ich aber fündig geworden. Es ist gar nicht so einfach, etwas zu MVP zu finden..

http://stackoverflow.com/questions/11367250/concrete-code-example-of-mvp

Wobei das nur ein Ansatz ist, da seine View teilweise auch noch Logik enthält. Aber jedem das seine. Es ist ja nur ein Pattern, das mehr oder weniger eindeutig definiert ist bzw. das einfach zu flexibel sein kann, um sich nur an eine strikte Vorgabe zu halten.

Denn was ich auch gerne mache, falls sinnig: innerhalb eines Getters einer Variable im Model kurz abfragen, ob die richtige Information bereitgestellt wurde und dann eben die richtige Information zurückliefern oder null.
So brauche ich weder eine extra Helper-Methode, noch muss ich diese Abfragen tausend mal wiederholen.


----------



## Jardcore (17. Jun 2016)

In JavaFX habe ich meine Projekte immer so strukturiert:
--> Model ist nur für die Datenhaltung da. Getter und Setter sind einfach nur solche, zusätzlich gibt es die Properties.
--> View ist die .fxml und Datei.
--> Controller verbindet View und Model via Binding API

Ich weiß nicht genau an welche Stelle hier der Presenter eingebaut werden könnte.
Oder ist mein Controller gar mein Presenter?


----------



## nvidia (17. Jun 2016)

Der Artikel ist der *original* Artikel zum MVP, dieser Artikel hat wohl den Begriff MVP ca. 1996 eingeführt. Das MVP kann als allgemeinere Version des MVC aufgefasst werden und hat daher auch die Verbindung zwischen Model und View. Der Presenter (als eine allgemeinere Art eines Controllers) hat dort die Aufgabe alle benötigten Einzelteile miteinander zu verbinden. Dein Verständnis vom MVP ist demnach nicht richtig.

Davon abgesehen gibt es einige Varianten des MVC deine beschriebene Variante Model <> Controller <> View ist eine davon. Verwendet man Swing landet man bei einer Variante die ein zusätzliches Application Model hat das eine Abstraktion für die Verbindung zum Domänenmodel stellt.


----------



## Kababär (17. Jun 2016)

Danke für den Hinweis


----------



## nvidia (17. Jun 2016)

Kababär hat gesagt.:


> Danke für den Hinweis


Im Prinzip ist eigentlich fast alles immer im Kern irgendwie die selbe Soße. Es gibt zusätzliche Abstraktionen um Trennungen zwischen bestimmten Aspekten zu schaffen und je nach "neuster Idee" werden die Kommunikationskanäle in unterschiedlicher Art und Weise verbunden. Zusätzlich haben alle gemein das es irgendein geartetes Eventsystem geben sollte welches für die Kommunikation sorgt damit sich bestimmte Entitäten nicht direkt unterhalten müssen um Daten auszutauschen. 

Bzgl. des Applicationmodels in Swing, TableModel ist so ein Kandidat. Das nimmt man als Proxy für sein "tabellenartiges" Domänenmodell, wobei sich hinter dem Wort "Modell" nicht eine einzige Klasse verstecken muss, das können auch tatsächlich mehrere sein.


----------



## dzim (27. Jun 2016)

Ist zwar schon eine Weile her, dieser Post, aber dennoch:
Adam Bien hat dazu ein minimalistisches Framework geschrieben. "AfterburnerFX". Ich bin nicht immer so der Fan von Convention over configuration, aber auf jeden Fall ist das Fremework

sehr klein
einfach zu verstehen
bietet DI (auch erweiterbar, z.B. über Guice)
trennt dir View von Logik, so gut es geht.
http://afterburner.adam-bien.com/
https://github.com/AdamBien/afterburner.fx

Und: Soweit ich es mitbekommen habe, ist es ziemlich beliebt.

Was mich davon abhält:

Ich finde den Ansatz von JavaFX, den Controller im FXML anzugeben auch nicht immer optimal, aber es stört mich auch nicht.
Wenn ich die Logik weghaben will, kann ich mir auch mittels DI einen "Service" injizieren, der die Business-Logik behandelt.
Mein Controller ist idealerweise wirklich nur noch das Ding, das auf User-Eingaben reagiert und die o.g. Services konsumiert.
Aber das ist nur meine Meinung. Schau dir das Framework mal an und - wenn dir gefällt, was du siehst - verwende es. 

Grüsse,
Daniel


----------



## Jardcore (27. Jun 2016)

Jardcore hat gesagt.:


> Hier mal die wohl am meisten verlinkten Quelle zu JavaFx und MVP:
> http://afterburner.adam-bien.com/


----------



## dzim (27. Jun 2016)

Lol. Sorry. Wer Lesen kann, ist klar im Vorteil.  Ich offenbar nicht...


----------



## Kababär (28. Jun 2016)

Danke, aber ich will auf Frameworks verzichten. Immerhin kann ich ja schnell meinen eigenen Presenter schreiben und habe es hinbekommen.
So im Nachhinein betrachtet, finde ich ihn doch etwas unnütz, da er quasi nur Variablen und Objekte vom Controller ans Model oder andersrum weiterleitet bzw noch andere Methonde beinhaltet.
Prinzipiell ist so ein Presenter ja halt irgendeine andere Klasse, die Aufgaben erledigen soll (bspw. SaveUserInputText oder so was). 

Aber dennoch danke


----------

