MVC - Problem mit Ebenen

Status
Nicht offen für weitere Antworten.

Kaini

Mitglied
Ich versuche gerade mein Programm nach dem MVC Prinzip umzubauen.

Dabei habe ich aber das Problem der Ebenen; ich habe die Liste mit allen Gerichten diese beinhaltet einzelne Gerichte welche widerrum Zutaten beinhalten.

Im View habe ich zwei Fenster. Den Haptframe der eine Tabelle mit allen Gerichten darstellt. Das ist soweit kein Problem, wie im MVC-Beispielcode aus den FAQ kennt der Hauptframe das Contoller-Interface und wird mittels Observer-Pattern über Änderungen im Model informiert.

Wenn es relevant ist hier das Codegerüst:
Code:
public class MainFrame implements Observer {
    public MainFrame(Language langfile, ListControllable c) {
        // ...
    }

    public void update(Observable o, Object arg) {
        GerichtList l = (GerichtList) arg;
        lblAnzahl.setText(lang.getString("anz") + ": " + l.getLenght() );
    }

    // ...

}
Und auch das TableModel der Tabelle ist auch Observer der auf Änderungen wartet.

Das Problem ist mir Fehlt jetzt ein Ansatz für das Bearbeiten bzw. Anlegen von neuen Gerichten.
Derzeit überlege ich für jede Ebene im Model einen Controller (der einfach heit halber durchnummerriert) zu schreiben.

Also wenn der Controller1 ein Element der Ebene 2 hinzufügt wird immer ein Coltroller2 mit dem Element verknüpft usw.
Zur verständlichkeit noch ein Stückchen Code wie ich mir das Vorstelle: (ein Gericht (Ebene 2) bekommt eine Zutat (Ebene 3))
Code:
public class Controller2 implements GerichtControllable {
    private ArrayList<Controller3> controllers = new Arraylist<Controller3>();
    private Gericht gericht; // im Konstructor übergeben

    public void addZutat() {
        Zutat z = new Zutat(0.0, "", ""); // Standartwerte
        gericht.addZutat(z);
        controllers.add(new Controller3(z));
    }
}

Bei diesem Ansatz gibt es meiner Meinung nach zwei mehr oder weniger große Probleme:
Man muss die Controller List und das Model Objekt sychron halten. (also wenn ich eine Zutat aus dem Model lösche muss ich den Controller auch löschen, da sonst das Programm mit den Indizes in durcheinander kommt)
Und die View Ebene muss sich auf Indizes verlassen können (z.B. braucht der EditButton in der View Ebene 1 den Index des zu bearbeitenden Gerichtes (Ebene2))
Das 2. Problem ist mehr oder weniger das erste, nur im View...

Ist das der richtige Ansaz oder denke ist in die falsche Richtung?
 
Also dein Ansatz verwirrt mich eher etwas...

So könnte man es ungefähr machen:

Für beide Sichten , also der Übersicht über die Gerichte und für die Detailansicht, werden
je eine Componente (Model/View/Controller-Kombination) erstellt.

In einem Controller-Interface werden die Methoden add,update,delete usw. definiert.

Beide Controller implementieren dann dieses Interface.
Sie sind je mit ihrer jeweilig spez. View gekoppelt.

Der "GerichtlistController" hält als Member die Gerichtsliste.
Code:
 private ArrayList gerichte
Wird ein Listeneintrag selectiert, dann wird dieser Eintrag im Member
Code:
private Gericht selectedGericht
gehalten


Bei betätigen z.B des delete-Buttons kann die Operation in der Gerichtlist-Komponente erfolgen.

Bei hinzufügen oder ändern wird der Deteilcontroller aufgerufen und die Referenz (das ausgewählte Gericht)übergeben:
z.B
Code:
update()
{
  ...
 new Detailcontroller(selectedGericht)
}

In der DetailView werden die Daten angezeigt.


Bei erfolgten Update musst du, je nachdem wie Du Workflow gestaltet hast, noch die
"GerichtlistView" aktualisieren (Observer - Pattern)




hmm..
In der Detailsicht wiederholt sich das.
Also implementierst du im dortigen Controller auch
wieder die add/update/delete -Methoden, wo du dann z.B in der update - Methode den
Zutatencontroller aufrufst (mit der ausgewählten oder neu erzeugten Zutat als Referenz.

Also, ich revidiere mich. Du hast natürlich 3 Komponenten.
 
Auf jeden Fall ist dein Ansatz besser als meiner :applaus:

In einem Controller-Interface werden die Methoden add,update,delete usw. definiert.
Wirchlich nur ein Interface oder für jedene Ebene eines? Ich brauche meiner Meinung nach für jede Ebene ein eigenes Interface, da ja das Gericht noch andere Eigenschaften hat, die verändert wer werden sollen (Name...). Bzw. der ZutatenController hat kein delete und add weil es schon die kleinste Einheit ist.

Das einzige was mir an diesem Prinzip auffällt ist, dass der Frame immer mitteilen muss ob der Benutzer was anderes ausgewählt hat, aber ist denke das ist ein notweniges Übel.

Edit: Naja es geht bei mir nochnicht so ganz
Wie teile ist dem Hauptframe mit, dass der Gericht Frame fertig ist? :bahnhof:
Bzw. das muss ich nicht dem Hauptframe mitteilen sondern dem HauptController, damit der dann ein notifyObservers auslöst.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben