MVC Pattern Verständnisfrage

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.412
Hallo Leute,

ich programmiere schon einige Zeit in Java und habe einige Applications geschrieben.
Nun habe ich mich mal dran gesetzt nach dem MVC Pattern zu arbeiten.

Nun kommt mir folgende Frage auf, wenn ich eine GUI Anwendung habe, wie sollte ich das am besten gestalten für jedes Panel hier jeweils View, ein eigene Model Klasse und alles zusammen führen in einen einzigen Controller der dann in der main Klasse aufgerufen wird?

Oder auch jeweils einen Controller der jeweils in der main dann aufgerufen wird ?

Wie geht ihr vor, ich bin gerade erst dabei MVC zu verstehen und zu nutzen.
 
Der Sinn von MVC liegt gerade in der Trennung der namensgebenden Bereiche.
Wenn du also wirklich sauber bleiben willst, um eine maximale Wiederverwendbarkeit und geringen Aufwand bei Anpassungen erreichen moechtest, dann wird jedes Panel eine eigene Klasse, mit dazugehoerig eigenem Controller (natuerlich auch als eigene Klasse).

So hat schon jedes Panel sein Layout und die Funktion voneinander getrennt. Dann brauchst Du im Hauptcontroller nur noch instanziieren, was Du benutzen willst. Ja nach Komplexitaet der Anwendung ist diese dreistufige Architektur erst nur der Anfang. ;)
 
Alles in einem Controller zusammenlaufen lassen ist meisens unvorteilhaft.
Zwar sieht es am Anfang relativ komfortabel aus, aber früher oder später wirst du das God-Klassenproblem haben - nämlich, dass eine Klasse zu mächtig wird.

Gehe nach Zuständigkeiten vor. Das heißt, für jede Zuständigkeit gibt es ein Controller.

Beispiel Filmdatenbank:
Man könnte einen Controller für das Handeln der Datenbank, einen anderen für das Handeln der Daten (z.B ein Vektor, eine Hashmap etc sein, je nachdem womit du arbeitest), eventuel einen für Tables etc.
Versuch, generell alles modular aufzubauen und die Klasse so klein wie möglich zu halten.

edit: owned
 
Guten Tag,

ich greife das Thema hier mal auf anstatt ein neues aufzumachen.

Irgendwie will mir das MVC Pattern, sobald es geringfügig komplexer wird, noch nicht so ganz in den Kopf. Die üblichen Beispiele verstehe ich in der Regel, da diese auch immer simpel und klein gehalten sind.

Ich verstehe jedoch nicht, wie ich mehrere Controller und Views handhaben soll. Versuche grade folgendes in Java zu konstruieren:

Ich habe eine MainView, welche von JFrame erbt. Diese enthält eine ContentView und eine ControlsView, welche beide von JPanel erben. Ich habe das bisher so verstanden, dass ich am besten für jede View einen eigenen Controller erstelle und auch Panels als Views behandle. Also habe ich einen MainController, welcher einen ContentController und einen ControlsController (schrecklicher Name :p) enthält.

Der ControlsController implementiert jetzt das ActionListener Interface. Dieser bekommt also durch die actionPerformed Methode mit, wenn jemand einen Knopf betätigt. Aber wie sagt dieser nun meinem MainController 'sorg mal dafür, dass der ContentController die ContentView ändert'? Denn Main hat ja eine Instanz von Controls und nicht andersrum.

Muss ich jetzt noch irgendwie mit Observer Pattern arbeiten?

Hoffe mein Problem ist irgendwie verständlich geworden. Anbei noch eine Grafik, wie ich mir das gedacht habe (hoffe hab die UML Notationen halbwegs richtig genutzt).
 

Anhänge

  • MVC.png
    MVC.png
    69,7 KB · Aufrufe: 211
Das sieht doch schon mal ganz gut aus:

Also noch mal grundlegend: Du schrobst dass ich am besten für jede View einen eigenen Controller erstelle. Steich das am besten.
Grund: Ein View sollte so dumm wie nur irgend möglich sein. D.h. dein View enthält nur die darzustellenden Elemente (InputFelder, Labels, Buttons, etc.) und natürlich die Anordnung und das nötige Layout. D.h. jeder View muss von einem Controller bedient werden, sonst wird er nicht mit Daten gefüllt.

Das MVC Prinzip sollte (es ist keine Pflicht, es dient ja nur der Übersicht) immer so aufgebaut sein:
Model: Ein einfaches POJO. D.h. irgendwelche Felder und die passenden Setter und Getter
View: Wie schon gesagt: Einfach nur die UI Elemente und die Setter und Getter
Controller: Arbeitet mit den Models und reicht die Daten zum View weiter (und natürlich auch umgekehrt)



Damit nun 2 Controller miteinander kommunizieren können gibt es verschiedene Möglichkeiten:
1. ganz simpel (observer pattern):
In deinem MainController instanziierst du ja den darin enthaltenen Controller, also könntest du über public Methoden einfach auf dessen Daten zugreifen und schreiben/lesen. D.h. du gibst z.B. deinem ContentController eine Methode public void changeView(...) und rufst diese von deinem MainController auf.

2. eventBus:
Google Guava enthält einen EventBus. Damit lassen sich ziemlich tolle Sachen bauen und die Controller müssen sich nicht gegenseitig kennen.
Angenommen du hast eine große Hierarchie von Controllern, dann könnte es natürlich passieren, dass du über viele viele Klassen die Daten weiterleiten musst, das macht den Code nicht gerade übersichtlich. Ein EventBus macht das extrem einfach:
Jeder Controller kann sich auf beliebige Events registrieren und genau so kann jeder Controller beliebige Events verschicken. Ein Event ist einfach ein Objekt, kann also Daten transportieren. (Beispiel: http://codingjunkie.net/guava-eventbus/ )


Grüße
 
Zurück
Oben