MVC Model

Slevin83

Grünschnabel
MVC Model
Hallo zusammen,

ich schreibe gerade eine kleine Anwendung um das MVC Model zu üben.
Im Großen und Ganzen ist mir alles klar dann bin ich heute auf folgende Frage gestoßen:

Wie bekomme ich die "Daten" von der View zum Controller?
Also wie spreche ich die grafischen Komponenten richtig an, ist es richtig die Komponenten in der View auf "public" zu setzen oder brauche ich dafür auch getter und setter?

Als Beispiel damits klarer wird habe ich eine Jlist in der View die ich im Moment auf public habe und auf die ich im Controller zugreifen möchte/muss.

View:

Java Code:
  1. public final JList jplayerList;


Controller:

Java Code:
  1. public void actionPerformed(ActionEvent e) { ...

  2. String selectedItem = view.jplayerList.getSelectedValue().toString();
  3. ...


Grüße
Slevin
 

Improof

Erfahrenes Mitglied
Hallo Slevin83,

du solltest lieber immer Getter und Setter verwenden. Da du aber ja am Controller nicht auf die Elemente der View, sondern nur auf die Werte eingehen willst, solltest du direkt dafür Getter machen.

Wenn du z.B. eine View hast mit einem JTextField in das man eine Email-Adresse eingibt, dann würdest du eien Getter für die Adresse und nicht für das Textfeld machen.

Beispiel:

Java:
/*
     *  So solltest du es nicht machen:
     */
    // View
    private JTextField emailField;
   
    public JTextField getEmailField() {
        return emailField;
    }
   
    // Controller
    String emailAddress = view.getEmailField().getText();
   
   
    /*
     * Richtig so:
     */
    // View
    private JTextField emailField;
   
    public String getEmailAddress() {
        return emailField.getText();
    }
   
    // Controller
    String emailAddress = view.getEmailAddress();

Mit den Settern das gleiche Spielchen, lieber view.setEmailAddress("..."); als view.getEmailField().setText("..."); (in meinem Beispiel).


Gruß
Daniel
 

Slevin83

Grünschnabel
Sehr schön vielen Dank Daniel mit dieser Antwort kann ich doch schon mal was anfangen!

Wird das nicht ein wenig zu viel wenn ich für jede Funktion oder Eigenschaft die ich abfragen oder ändern möchte ein getter und setter brauche?

Mein Bsp. mit der JList dort muss ich vorher auch noch sicherstellen, dass die List nicht leer ist und bräuchte ja dann wieder ein getter für extra diese Abfrage.

Java:
if (!view.jPlayerList.isSelectionEmpty()) {

         String selectedItem = view.jPlayerList.getSelectedValue().toString();
         ...
}

Also praktisch jedesmal wenn ich jPlayerList.xxx anspreche brauche ich ein getter oder setter? Richtig?
 

sheel

I love Asm
Hi

Die jPlayerList soll eben nicht direkt angesprochen werden. Und je nach Fall machts auch keinen Sinn, die Inhaltsabfrage davon 1:1 über eine eigene Getter-Methode zugreifbar zu machen.

Die View im Gesamten hat einen Sinn wie zB. "Anzeigen einer Liste von Spielern", und jede öffentlich zugreifbare Methode soll etwas mit dem Sinn zu tun haben. Ein getPlayer(), das den Spieler direkt zurückgibt ist ok; dass der Controller sich mit GUI-Elementen wie JList´s herumärgern muss ist nicht ok (und auch Abfragen wie "welcher Index ist markiert usw. haben den Controller nicht zu interessieren)

Eines der wichtigsten Merkmale von korrekter MVC-Anwendung ist, dass jeder der Teile (M/V/C) austauschbar bzw. änderbar sind, ohne irgendwas in den anderen zwei Teilen zu ändern (bzw. nur sehr sehr wenig). Wenn der Controller direkt mit JLists arbeitet, was wäre wenn man die GUI ändert sodass sie keine JList mehr verwendet; oder statt der Swing-GUI eine HTML-Seite macht? Oder die Konsole?

Bez. Getter/Setter:
Bei kleinen Projekten kann einem die Anzahl von Gettern/Settern schon viel bzw. unnötig viel vorkommen.
Oft ist es das auch (unnötig). Aber bei größeren Projekten freut man sich dann darüber, weil ohne alles noch umständlicher wird. Und wenn man sich bei größeren Projekten erst daran gewöhnen muss, Getter/Setter zu verwenden, weil man es bei den kleinen nie gemacht hat, gehts nicht gut (versprochen)
 
Zuletzt bearbeitet:

Improof

Erfahrenes Mitglied
Hi Slevin83,

Mein Bsp. mit der JList dort muss ich vorher auch noch sicherstellen, dass die List nicht leer ist und bräuchte ja dann wieder ein getter für extra diese Abfrage.

Ja ok dafür brauchst du eine extra Abfrage, ABER wie sheel schon gesagt hat, diese befindet sich in der View. Dort hast du einen Getter "getSelectedPlayer()" und in dieser Methode prüfst du, ob etwas selektiert ist. Wenn ja gibst du den Eintrag zurück, wenn nein, dann eben null. Der Controller bekommt dann nur den Player (als String in deinem Fall) oder eben null -> und darauf prüfst du im Controller.

Und falls es für dich wirklich wichtig ist, im Controller zu sehen, ob etwas selektiert ist oder nicht, dann programmierst du dir eben dafür eine kleine Hilfsfunktion:

Java:
public boolean isPlayerSelected()
{
    return this.view.getSelectedPlayer() != null;
}


Gruß
Daniel