# MVC



## Sanix (4. Feb 2010)

Hi,

Ich habe eine grundsätzliche Frage zu MVC. Nehmen wir eine Applikation an mit ein paar Buttons und einer Liste. Der Listeninhalt wäre ja das Modell. Wenn ich jetzt einen Button drücke, wie soll der Controller aufgerufen werden von der View? Also der Button z.B. removed selected.

Jetzt könnte der Controller eine Methode anbieten removeItem(Item i). Der Controller führt die Ànderung im Model durch, welches eine Notifikation sendet.
Laut der Sun Seite habe ich eher das Gefühl (Java SE Application Design With MVC), dass der Controller eine Methode event(Event event) bietet. Also er entscheidet selber was die Aktion bewirken soll. Dann könnte sich der Controller eigentlich gleich als Listener registrieren.

Bei Variante 1 ist es umständlich, dass es via Controller gehen muss, da die View die Aktion kennt, die auf dem Model ausgeführt werden muss.

Schon im vorraus Danke für eure Erklärungen


----------



## SlaterB (5. Feb 2010)

> wie soll der Controller aufgerufen werden von der View? Also der Button z.B. removed selected.
[..]
> Jetzt könnte der Controller eine Methode anbieten removeItem(Item i)

removeItem(Item i) ist zu spät gedacht, die Methode könnte auch schon Teil des Models sein, Programmlogik ist nicht unbedingt Controller-Aufgabe,
was der Controller auf jeden Fall machen muss, ist schlicht, diese Aktion auszulösen

die View ist entweder ein Button oder auch ein TextFeld oder eine JComboBox, austauschbar,
zeigen vor allem Daten an, und ermöglichen grundsätzlich, dass User-Ereignisse wie Button-Klick/ Texteingabe/ Selektion auch ins System zurückkommen,
das sind aber zunächst uninterpretierte Eingaben,

an einer bestimmten Stelle steht dann etwa ein ActionListener, der das ganze in eine konkrete Aktion umlenkt, etwa

```
actionPerformed(Event) {
   model.remove(xy);
}
```
diese eine Zeile könnte der ganze Controller für diesen Anwendungsfall sein, alles weitere ergibt sich automatisch aus dem Aufruf

würde man die View von Button auf TextFeld ändern, könnte man evtl. denselben ActionListener beibehalten,
bei JComboBox wählt man evtl. einen anderen Listener sein, aber quasi mit gleichem Inhalt

abstrahieren könnte man durchaus mit einer allgemeinen Controller-Klasse und wirklich wie du vorschlägst
einer Methode a la führeAktionZuAnwendungsfall347Aus() oder auch schöner benannt removeItemSowieso()
und in den ActionListenern oder Combobox-ItemListener wird nur diese Aktion aufgerufen,
da ist es dann fließend ob in diesem Fall die Listener noch zur View hin interpretiert wird als Teil des initialen EventHandlings 
und erst in der Controller-Methode gehts richtig los,

bei einem schnurgeraden Vorgang setzt man die Grenzen eher willkürlich,
deutlicher wirds wiederum, wenn es Verzweigungen in den Aktionen oder Rechteprüfung gibt,


----------



## L-ectron-X (5. Feb 2010)

Auch mal in die FAQ gucken, da wurde das Thema erschöpfend behandelt.


----------

