Announcement

Collapse
No announcement yet.

MVC richtig umgesetzt?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MVC richtig umgesetzt?

    Hallo!

    Ich versuche, das MVC-Konzept zu verstehen: Was view, model und controller vom Prinzip her sind, habe ich einigermaßen verstanden
    - model: Daten
    - view: GUI
    - controller: vermittler zwischen GUI und Daten

    Aber das Zusammenspiel ist mir noch unklar, vor allem, wer wen als Referenz übergeben bekommt. Ich habe hier mal ein kleines Beispiel programmiert:

    Code:
    import java.awt.BorderLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.SwingUtilities;
    
    public class View {
    	
    	private Controller controllerFuerDiesenView;
    	
    	public View() {
    		initGUI();
    	}
    	
    	public void initGUI() {
    		JFrame einframe = new JFrame();
    		einframe.setLayout(new BorderLayout());
    		einframe.setSize(300,400);
    		einframe.setLocationRelativeTo(null);
    		einframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel einpanel = new JPanel();
    		einpanel.setLayout(new BorderLayout());
    		
    		//Model erzeugen
    		Model mymodel = new Model();
    		
    		//View mit model verbinden
    		JButton button = new JButton(mymodel.giveText());
    		JTextArea textinput = new JTextArea();
    		
    		
    		// View mit Controller verbinden
    		controllerFuerDiesenView = new Controller(mymodel);
    		textinput.addKeyListener(controllerFuerDiesenView);
    		button.addActionListener(controllerFuerDiesenView);
    		
    		einpanel.add(button, BorderLayout.NORTH);
    		einpanel.add(textinput, BorderLayout.SOUTH);
    		einframe.add(einpanel, BorderLayout.CENTER);
    		einframe.setVisible(true);
    	}
    	
    	
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    
    			@Override
    			public void run() {
    				View myview = new View();
    			}
    			
    		});
    	}
    	
    
    }

    Code:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    import javax.swing.JTextArea;
    
    public class Controller implements ActionListener, KeyListener {
    
    	private Model model;
    	
    	public Controller (final Model param) {
    		this.model = param;
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent event) {
    		System.out.println("Button gedrückt");
    	}
    
    	@Override
    	public void keyPressed(KeyEvent event) {
    		
    	}
    
    	@Override
    	public void keyReleased(KeyEvent event) {
    		
    	}
    
    	@Override
    	public void keyTyped(KeyEvent event) {
    		
    	}
    
    }
    Code:
    public class Model {
    	
    	private String dertext = "Hallo";
    	
    	public String giveText() {
    		return dertext;
    	}
    
    	public void setText(final String param) {
    		dertext = param;
    	}
    
    }
    Ist das so richtig aufgeteilt? Und stimmen die Referenzübergaben?

  • #2
    Die extra Haltung des Model ist sicherlich ok
    Ein Controllerelemet sehe ich nicht wirklich. Warum nun es eine extra Klasse für den Action Listener geben muss, und die sich Controller nennt, erschließt sich nicht. Zumal das überschreiben aller Events wenig sinnvoll ist. Üblicherweise benutzt man ein Actionlistener je Steuerelement. Was willst du tun, wenn mehrere Button die perform aufrufen. Dort erst prüfen, welches Steuerelement war es denn?
    Ein Controller übernimmt eher nach den Listenern die Programmausführung.
    Ob die Referenzen richtig übergeben werden kannst du besser prüfen, in dem du das Programm ablaufen läßt. Warun das hier theoretisch nachvollzogen werden muss....
    Zuletzt editiert von Christian Marquardt; 24.09.2014, 18:41.
    Christian

    Comment


    • #3
      Macht der Controller auch irgendwas? An sich sieht es nicht schlecht aus, aber der Controller manipuliert weder View noch Model

      Ausserdem ist heutzutage das pure MVC Pattern überholt. In Zeiten von Databinding und Templating gibt es x-tausend verschiedene Ausprägungen dieses Patterns, keines davon ist allerdings MVC "by the book". Bei purem MVC macht man die komplette Kommunikation zwischen Daten und UI selbst. Mittlerweile haben sich aber Frameworks etabliert die dies für Dich übernehmen und wesentlich bequemer machen. Ich denke so etwas gibt es mit Sicherheit auch für Java. Bin aber was Java Desktop Anwendungen angeht auch nicht sehr fit

      Comment


      • #4
        Neuer Code:

        Code:
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.awt.event.KeyEvent;
        import java.awt.event.KeyListener;
        
        import javax.swing.JButton;
        import javax.swing.JTextArea;
        
        public class Controller implements ActionListener {
        
        	private Model model;
        	
        	public Controller (final Model param) {
        		this.model = param;
        	}
        	
        	@Override
        	public void actionPerformed(ActionEvent event) {
        		model.setText("NeuerText");
        		JButton temp = (JButton) event.getSource();
        		temp.setText(model.giveText());
        	}
        
        }
        Code:
        public class Model {
        	
        	private String dertext = "Hallo";
        	
        	public String giveText() {
        		return dertext;
        	}
        
        	public void setText(final String param) {
        		dertext = param;
        	}
        
        }

        Code:
        public class View {
        	
        	private Controller controllerFuerDiesenView;
        	
        	public View() {
        		initGUI();
        	}
        	
        	public void initGUI() {
        		JFrame einframe = new JFrame();
        		einframe.setLayout(new BorderLayout());
        		einframe.setSize(300,400);
        		einframe.setLocationRelativeTo(null);
        		einframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        		JPanel einpanel = new JPanel();
        		einpanel.setLayout(new BorderLayout());
        		
        		//Model erzeugen
        		Model mymodel = new Model();
        		
        		//View mit model verbinden
        		JButton button = new JButton(mymodel.giveText());
        		
        		// View mit Controller verbinden
        		controllerFuerDiesenView = new Controller(mymodel);
        		button.addActionListener(controllerFuerDiesenView);
        		
        		einpanel.add(button, BorderLayout.NORTH);
        		einframe.add(einpanel, BorderLayout.CENTER);
        		einframe.setVisible(true);
        	}
        	
        	
        	public static void main(String[] args) {
        		SwingUtilities.invokeLater(new Runnable() {
        
        			@Override
        			public void run() {
        				View myview = new View();
        			}
        			
        		});
        	}
        	
        
        }

        @Christian: Was meinst du, das Model als eigene Klasse ist OK? Ich dachte, dass man das model auf jeden Fall als eigene Klasse implementieren muss.

        Und den Controller habe ich als eigene Klasse, um klar zu machen, dass das der Controller ist und ein eigenes Modul darstellt... Aber so wie ich dich verstehe, ist die Klasse, die ActionListener implementiert nicht notwendigerweise der Controller? Wie würde ich denn dann hier alles in den Controller packen?

        Und "Referenzen richtig übergeben" meinte ich eher semantisch: Wer darf über wen Bescheid wissen: das Model muss ja Controller und View kennen, das Model sollte komplett unabhängig von allem sein und damit austauschbar...
        Im Moment wird ja der Controller vom View benachrichtigt, der Controller ändert das Model UND gibt aber auch dem View die neuen Daten des models. Irgendwo habe ich gelesen, dass die Views auch direkt mit dem Model kommunizieren dürfen...

        Comment


        • #5
          @Christian: Was meinst du, das Model als eigene Klasse ist OK? Ich dachte, dass man das model auf jeden Fall als eigene Klasse implementieren muss.
          -> Ja, das sollte das aussagen

          Ich sehe nicht, dass du einen Controller hast/brauchst. Hinsichtlich des MVC sollte man sich fragen :"Wenn ich das M, V oder C ändere/ersetze, kann ich dies tun ohne die anderen Teile wesentlich zu ändern"
          Beispielsweise die GUI von Swing mit einr Weboberfläche ändern. Zweiflesfrei würde der Actionlistener zur GUI gehören und nicht Teil des Controllers sein.

          Das Pattern ist auch kein Zwang. Wenn deine Anwendung eben aus Eingabe->Validierung->Datenbank besteht gibt es eben kein Controller (View & Model). Als Controller könnte ich mir ein Element vorstellen, dass die validierten Eingaben enpfängt, damit andere Server versorgt oder diese noch mit weiteren Daten von anderen Servern verknüpft, dann in die DB schreibt. Dieses Element müsste auch arbeiten, wenn die GUI ausgetauscht wird
          Zuletzt editiert von Christian Marquardt; 27.09.2014, 18:19.
          Christian

          Comment


          • #6
            Okay, das mit dem Controller hab ich noch geändert... ich denke, jetzt ist es mir etwas klarer. Danke!

            Comment

            Working...
            X