Ergebnis 1 bis 10 von 10

Thema: Model View Controller - wie ?

  1. #1

    Model View Controller - wie ?

    Eig bin ich nur im RPG Atelier, aber wenn hier auch ein solches Forum gibt kann ich ja gleich mal ne Frage stellen ^^

    Und zwar hab ich in meiner Hochschule die Aufgabe bekommen Reversi zu programmieren, und zwar objektorientiert UND nach dem MVC Pattern. Also hab ich jetzt drei Klassen, und ein Main mit den drei Konstruktoren, die auch Objekte übergeben. Ich habs jetzt immerhin so weit dass sich das Startfeld aufbaut und im View angezeigt wird. Aber weiter komm ich nicht. Bei dem Versuch eine Schleife einzubauen damit das Spiel durchläuft komm ich einfach nicht weiter. Wie macht man sowas denn richtig, dass der Controller die anderen zwei Klassen nochmals durchlaufen lässt ? Weil bis jetzt hab ich es zwar hinbekommen, das Spielbrett neuzuzeichnen, aber die Variablen welcher Spieler am Zug ist und wer wie viele Steine hat bleibt beim zweiten mal immer noch beim Anfang.
    Hat vllt zufällig jmd Erfahrung mit sowas ? Eine Seite wo man sowas gut nachlesen kann ? In den Foliensätzen vom Dozenten ist über MVC überhaupt gar nichts vorhanden -.-

  2. #2
    Guckst du hier:
    http://de.wikipedia.org/wiki/Model_View_Controller

    MVC ist ganz einfach.
    View: Kümmert nur um das Zeichnen und dem Controller sagen, dass Eingaben gemacht wurden.
    Model: Beinhaltet alle Daten - wenn sich was ändert, so dem View sagen, dass es neu zeichnen soll.
    Controller: Reagiert auf Eingaben und manipuliert das Model.

    Dann hast du schon die 3 Objekte (View, Model und Controller).
    Wenn du alle 3 erzeugst und dann dem View den Controller, dem Model das View und dem Controller das Model übergibst, so hast du schon ein MVC.

    Geändert von niR-kun (05.01.2013 um 18:11 Uhr)

  3. #3
    Ja das grundsystem hab ich längst verstanden, den Wiki Artikel hab ich auch schon gesehen. Nur ich bekomm das einfach nicht umgesetzt -.- Ich hab davor nur GameMaker oder RMXP gemacht, da gabs keine Objektorientierung.
    Bis jetzt befiehlt der Controller das View neuzumachen, soll ich es ändern dass das Modell befiehlt ?

  4. #4
    Zitat Zitat von MindXperience Beitrag anzeigen
    Ja das grundsystem hab ich längst verstanden, den Wiki Artikel hab ich auch schon gesehen. Nur ich bekomm das einfach nicht umgesetzt -.- Ich hab davor nur GameMaker oder RMXP gemacht, da gabs keine Objektorientierung.
    Bis jetzt befiehlt der Controller das View neuzumachen, soll ich es ändern dass das Modell befiehlt ?
    Das ist reine Geschmackssache. Wenn die Daten, die der Controller an das Model gibt, nicht intern vom Model verändert werden, kannst du das so lassen.

    Objektorientierung solltest du schon gehabt haben, wenn es zu MVC geht. Welche Programmiersprachen musst du benutzen?

  5. #5
    Wir benutzen Java
    Jaja das haben wir auch schon paar mal, aber immer nur bei so mega einfachen Beispielen. Mir fehlt da völlig die Übung.

    Also meine Konstruktoren sehen etwa so aus:

    Model model = new Model();
    View view = new View(Model model);
    Controller controller = new Controller(Model model, View view);

    Das Modell erstellt das Feld, das View zeigts sofort erstmal an und dann kommt der Controller. Als Test versuch ich grad einfach so eine neuen Stein zu setzen, und dann das View nochmal aufzurufen (wie müsste der Befehl richtig lauten ? Ich hab sowas wie: new view(Model model) Das Feld wird zwar angezeigt, aber ich hab dauernd Probleme die Variablen (Spieler, Anzahl Steine) an den View ziu übertragen.

  6. #6
    Da gibt es verschiedene Möglichkeiten.
    • Du könntest die entscheidenden Eigenschaften der Model-Klasse public deklarieren. Dann könntest du in View direkt auf sie zugreifen.
    • Du könntest "get" und "set" verwenden (ich schätze mal, dass Java sowas genau wie C# unterstützt) um das Programm wissen zu lassen, wie andere Klassen auf bestimmte Eigenschaften von Model zugreifen dürfen und wie nicht.
    • Du könntest auch einfach eine public Methode in Model deklarieren, die genau die Daten zurückgibt, die du in View brauchst.

    Im Prinzip ist komplett dir überlassen, wie du das Problem angehst. Entscheidend ist eigentlich nur, dass die eigentliche Arbeit innerhalb ihrer jeweiligen Klassen erledigt wird.

  7. #7
    Ich denk ich versuchs nochmal mit den Gettern ..
    Vom Prinzip her versteh ich ja das meiste, aber das Eclipse zickt bei mir wirklich in fast jeder Zeile rum weil immer iwas fehlt >_>

    danke für eure Hilfe

  8. #8
    Mach dich in diesem Zusammenhang mit Listenern vertraut. Die wirst du hier gebrauchen.
    Im Model bastelst du am Besten eine Methode, die die Events abfeuert. Der Controller registriert die jeweiligen Views für das Event.
    Beispiel:

    Interface:
    Code (Java):
    public interface DoSomethingListener
    {
      void onDoSomething(Object sender);
    }

    Model:
    Code (Java):
    public class ModelClass
    {
      List<DoSomethingListener> listener = new ArrayList<DoSomethingListener>();
     
      public void addDoSomethingListener(DoSomethingListener listener)
      {
        this.listener.add(listener);
      }
     
      private doSomething()
      {
        for (DoSomethingListener listener : this.listener)
        {
          listener.onDoSomething(this);
        }
      }
      ...
    }

    View:
    Code (Java):
    public class ViewClass implements DoSomethingListener
    {
      public void onDoSomething(Object sender)
      {
        // Code, der von der View ausgeführt wird
      }
    }

    Controller:
    Code (Java):
    public class ControllerClass
    {
      ModelClass model = new ModelClass();
      ViewClass view = new ViewClass();
     
      public void initialize()
      {
        this.model.addDoSomethingListener(this.view);
      }


    Wenn jetzt in der ModelClass irgendwo doSomething() aufgerufen wird, werden alle registrierten Listener abgearbeitet.
    Auf diese Weise ist das Model komplett unabhängig von der View. Die View kann jetzt nun alles Mögliche sein. Von Textausgaben auf dem Bildschirm oder Datei, bishin zu komplexen Grafiken. Das Model bekommt davon nichts mit. Mein Beispiel ist aber sehr rudimentär gehalten und soll auch nur die Arbeitsweise verdeutlichen. Es wäre auch noch besser, würde man noch Nebenläufigkeiten berücksichtigen und abfragen gegen null machen.

  9. #9
    Ich bedank mich für die sehr ausführliche Erklärung sowie Skript ^^
    Ob ichs so umsetz weiß ich aber noch nicht, aber ein bischen versuchen werd ichs mal

  10. #10
    Mit Hilfe von anonymen Klassen lässt sich der Evenhandler auch im Controller ausführen. Dann muss das Registrieren das Events folgendermaßen aussehen:

    Code:
    this.model.addDoSomethingListener(new DoSomethingListener() 
    {			
      @Override
      public void onDoSomething(Object Sender) 
      {
        view.doSomething();
      }
    });
    Das hat den Vorteil, dass die View nicht zwingend das Listener-Interface implementieren muss. Dadurch sind Model und View noch ein Stück unabhängiger voneinander.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •