[Java] MVC - Verständnisproblem

Renegade

Well-known member
ID: 159167
L
3 August 2006
851
77
Hi,

Ich möchte mir angewöhnen in Java nach dem Model-View-Controller Prinzip zu programmieren. Jetzt hab ich gelesen, dass es in Java +Swing sinnvoller ist, nach dem Model View Presenter Prinzip zu programmieren.

Stimmt das wirklich?


Angenommen ich möchte mir ein GUI programmieren, dass auf Knopfdruck Daten aus einer Datenbank ausliest und in eine Tabelle schreibt.
- Egal ob beim MVC oder dem MVP - in welcher Komponente müsste ich dann die Klasse legen, die für das auslesen der Daten zuständig ist? Die Daten selber müssten ja in dem Model gespeichert werden :think:

Ich hoffe ihr könnt mir ein bisschen Licht ins dunkle bringen :)
 
Bitte korrigiert mich, wenn ich falsch liege, ich beschäftige mich auch noch nicht so lange damit:

Das Model ist für das holen der Daten zuständig, aber sozusagen nur als Zwischenschicht zwischen eigentlicher Verarbeitung und Datenbank, ich habe bisher nur erlebt, dass Datenbank/Model-Abfragen aus dem Controller heraus getätigt wurden, bei dem dann das Model direkt mit Namen angesprochen und ihm die "Wünsche" mitgeteilt wurden (Model.find:)first) oder so ähnlich).
Diese Datenbankabfragen kannst du dann vom Controller aus dem View übergeben und dort verarbeiten.
 
Das MVC-Konzept ist mittlerweile ein bisschen überholt. Das von dir beschriebene Auslesen der Daten gehört imho in die Controller-Klasse. Da sich die Programmiertechniken aber in den letzten 30 Jahren weiter entwickelt haben, lässt sich das nicht mehr unbedingt so gut übertragen und das "klassische" MVC schränkt mehr ein, als dass es hilft.
Ich teile klassische Desktop-Applikationen immer in GUI, Schnittstelle, Logik und Datenhaltung. Wobei die Schnittstelle die Eingaben der GUI überprüft und an die Logik weiterleitet. Diese holt und manipuliert Daten.
 
Das Model ist für das holen der Daten zuständig, aber sozusagen nur als Zwischenschicht zwischen eigentlicher Verarbeitung und Datenbank [...]
Diese Datenbankabfragen kannst du dann vom Controller aus dem View übergeben und dort verarbeiten.
Jup, also es geht darum, dass du mit dem Model abstrahieren willst, wo die Daten liegen. Es soll möglich sein, dass diese in Textdateien oder einer Datenbank liegen. Du nutzt nur die Model-Funktionen um die Daten zu holen, das Model muss die Daten dann irgendwie in einer Struktur zurückliefern.
Das ist zB. ganz sinnvoll wenn du verschiedene Datenbanken unterstützen willst und dich nicht auf die SQL-Funktionen beschränken kannst, die alle können.


Das MVC-Konzept ist mittlerweile ein bisschen überholt. Das von dir beschriebene Auslesen der Daten gehört imho in die Controller-Klasse.
Habe ich den Post von Renegade falsch verstanden? Es ging doch gerade nur um das Holen der Daten oder? Und da sagt eben der Controller dem Model was er gene hätte.

Da sich die Programmiertechniken aber in den letzten 30 Jahren weiter entwickelt haben, lässt sich das nicht mehr unbedingt so gut übertragen und das "klassische" MVC schränkt mehr ein, als dass es hilft
richtig!
Datenbanken über ein Model ansprechen zu müssen, ist irgendwie eine Qual. Hab da schon Software-Projekte gesehen wo das Modell dutzende Methoden hatte, nur weil man immer versch. Dinge benötigt hat.
 
Habe ich den Post von Renegade falsch verstanden? Es ging doch gerade nur um das Holen der Daten oder? Und da sagt eben der Controller dem Model was er gene hätte.

Kommt drauf an, was konkret man nun unter dem "Auslesen" versteht. Beispiel SQL, das Formulieren der Query ist imho Aufgabe des Controllers, das Durchführen ist natürlich Aufgabe des Models.
 
Neija bei Datenbanken ist es ein Streitthema, denn i.R. verwendet man ja nicht das standardkonforme SQL (weil die Db-Hersteller sich nicht dranhalten) und man hat quasi sich wieder auf eine Datenquelle festgelegt, die gewählte Datenbank für den Query.
 
Hi,

Das alles ist wohl doch nicht so einfach wie ich gedacht habe.
Dass MVC veraltet ist, habe ich auch schon gelesen.
Welches Prinzip ist denn in der heutigen Zeit "die beste Wahl"?

Wie Tyrell es beschrieben hat: GUI, Schnittstelle, Logik und Datenhaltung?
 
Jup ;)
Nutze ich so in der Art auch.

Fürs Web kannste MVC aber noch gut verwenden, da man keine parallelen Dinge in Web-Applikationen hat, funktioniert das Konzept da noch gut.
 
Hi,

Habe ich das so richtig verstanden (um bei dem obigen Beispiel mit der GUI und der Datenbankabfrage zu bleiben)?

  • GUI - grafische Darstellung
  • Schnittstelle - Aktionen werden initialisiert wie z.B. ein ActionListener für ein Button; ruft dann die Logik auf
  • Logik - (hier in dem Beispiel) liest es die Daten aus der DB aus; veranlasst die Tabelle für die Daten ggf. neu anzuzeigen
  • Datenhaltung - Daten (aus der DB) werden hier gespeichert
 
Hi,

Ich habe nochmal eine Frage:

Ich habe 3 Buttons
Code:
JButton button1 = new JButton("Beenden");
JButton button2 = new JButton("Funktion 1");
JButton button3 = new JButton("Funktion 2");

Button 1 soll das Programm beenden, Button 2 die Funktion 1 aufrufen und Button 3 die Funktion 2 aufrufen.

Am liebstens wäre mir hierfür eine Klasse die das übernimmt, und die ich später erweitern kann (Button 4...).

Jetzt hab ich mir überlegt gibt es 2 Möglichkeiten:
1) Eine Klasse mit einem ActionListener, die dann zwischen den verschiedenen Buttons unterscheidet und dann die verschiedene Funktionen aufruft.
Jedem Button dann mit der Methode addActionListener() den Listener hinzufügen.

2) Eine Klasse mit verschiedenen Actions für jeden Button. Nur hier ist das Problem, dass ich in der Methode actionPerformed() der Klasse wieder zwischen den Buttons unterscheiden muss.

Gibt es eine gute Möglichkeit innerhalb von actionPerformed() zwischen den Buttons zu unterscheiden?
 
Dieselbe Frage hatte ich damals auch, wie ich mit Java angefangen hab. Die Lösung is eigentlich ganz einfach:
Leite JButton ab ;)
 
Geniale Idee :dance:

Habs jetzt so gemacht:
Code:
import javax.swing.JButton;
import java.awt.event.*;

public class button extends JButton{

	public button() {
		super();
	}
	
	public button(String text) {
		super(text);
    }
	
	public void setExit() {
		ActionListener exit = new ActionListener() {
			public void actionPerformed(ActionEvent e) { 
				System.exit(0); 
			}
		};
		
		addActionListener(exit);
	}
	
}
 
Hi,

Ich habe leider noch eine Frage :( :

Ich habe mir ja die Klasse JButton abgeleitet (siehe oben) und noch um eine Methode ergänzt:
Code:
	public void execute() {
		ActionListener execute = new ActionListener() {
			public void actionPerformed(ActionEvent e) { 
				System.out.println("muh");
			}
		};
		
		addActionListener(execute);
	}

In Klasse A definiere ich jetzt ein Button + der Methode:
button button1 = new button("Button 1");
button1.execute();

In Klasse B befindet sich eine statische Methode:
Code:
	public static void ausgabe() {
		System.out.println("muh2");
	}

Kann ich die Methode ausgabe() nicht direckt in Klasse A der Methode execute als Parameter übergeben, sowas wie z.B:
Code:
button1.execute(ausgabe());

Code:
	public void execute(// Methode m) {
		ActionListener execute = new ActionListener() {
			public void actionPerformed(ActionEvent e) { 
				m();
			}
		};
		
		addActionListener(execute);
	}

Das alles scheint mir sehr komplex, habe ich irgendwo ein grundlegenden Denkfehler?
 
Kann ich die Methode ausgabe() nicht direckt in Klasse A der Methode execute als Parameter übergeben

Nicht die Methode, sondern ein Objekt der KlasseB:
Code:
    public void execute(KlasseB obj) {
        ActionListener execute = new ActionListener() {
            public void actionPerformed(ActionEvent e) { 
                obj.ausgabe();
            }
        };
        
        addActionListener(execute);
    }

Wobei bei einer statischen Methoden kannst du doch auch direkt zurgreifen:

Code:
    public void execute() {
        ActionListener execute = new ActionListener() {
            public void actionPerformed(ActionEvent e) { 
                KlasseB.ausgabe();
            }
        };
        
        addActionListener(execute);
    }
 
Hi Robert,

Da liegt ja das Problem:
Ein extra Objekt möchte ich nicht, da die Methode eine statische ist. Allerdings möchte ich von Klasse A aus bestimmen welche Methode ich aufrufe (die Methode ist aber immer eine statische - aber ein unterschiedlichen Namen und eine unterschiedliche Klasse).
 
Achso. Da könnte evtl. Reflections behilflich sein. https://java.sun.com/docs/books/tutorial/reflect/member/method.html bzw. dann hier https://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html

Du müsstest dann Klassenname und Methodenname als String an deine execute-Methode übergeben.
Das würde dann darauf hinauslaufen, dass du dann in execute eine neue Instanz der Klasse an Hand des Strings erzeugst und die jeweilige Methode aufrufst.

Eine andere Möglichkeit wüsste ich dann erstmal nicht, aber heißt ja nicht, dass es nich doch noch anders geht ;)

Vielleicht hilfts dir ja weiter.
 
Hi,

Funktioniert perfekt :) Danke :)

Vielleicht ist ja jemand an der Lösung interessiert:
(Reflektion einer statischen Methode ohne Parameter)
Code:
public void execute(final String class_name, final String method_name) {
		ActionListener execute = new ActionListener() {
			public void actionPerformed(ActionEvent e) { 
				Class example = null;
				try {
					example = Class.forName(class_name);
				} catch (ClassNotFoundException e1) {
					e1.printStackTrace();
				} 
				Class[] parameterType = null; 
				Method method = null;
				try {
					method = example.getMethod(method_name, parameterType);
				} catch (SecurityException e1) {
					e1.printStackTrace();
				} catch (NoSuchMethodException e1) {
					e1.printStackTrace();
				}
				
				Object instance = null;
				Object[] argument = null; 
				try {
					method.invoke(instance, argument);
				} catch (IllegalArgumentException e1) {
					e1.printStackTrace();
				} catch (IllegalAccessException e1) {
					e1.printStackTrace();
				} catch (InvocationTargetException e1) {
					e1.printStackTrace();
				}
				
			}
		};
		
		addActionListener(execute);
	}