@Sophus: MVC ist, wie jerch schon schrieb, eine Frage der Architektur. Wenn Du einfach nur linear Daten verarbeitest, ist dies recht einfach: input -> processing -> output. Bei GUI-Programmen (oder Webapplikation) fällt diese Trennung vielen schwierig, bzw. wird erst gar nicht beachtet (z.B. in vielen einfach gestrickten PHP-Programmen, da PHP zur Vermischung der MVC-Komponenten geradezu einlädt).
Einfach gesagt: das Model sind die Daten, die du bearbeitest und ggf. auch wieder speicherst. Das Model gibt auch die Struktur dieser Daten wider. Der Controller ist das, wo du was mit diesen Daten machst - gerne auch 'Business Logik' genannt. Im obigen input -> processing -> output Beispiel wäre dies das processing. Die View ist das, wo du die Daten, ggf. per Controller bearbeitet, dem Anwender darstellst, bzw. präsentierst. Deshalb gerne auch Präsentationsschicht genannt.
Programme nach diesem Schema sind oft leichter zu pflegen, da die einzelnen Komponenten nicht wild miteinander verwoben werden. Also eine Frage der Architektur. Und der Disziplin, diese einzuhalten.
MVC mal anders?
- pillmuncher
- User
- Beiträge: 1530
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@Sophus: Das MVC-Pattern kann man IMO nicht verstehen, wenn man es auf das rein technische daran reduziert. Statt dessen muss man die Motivation dahinter begreifen. Trygve Reenskaug, einer der Erfinder von MVC, hat diese so formuliert:
Hier steht mehr dazu: http://heim.ifi.uio.no/~trygver/themes/ ... index.htmlTrygve Reenskaug hat geschrieben:The essential purpose of MVC is to bridge the gap between the human user's mental model and the digital model that exists in the computer. The ideal MVC solution supports the user illusion of seeing and manipulating the domain information directly. The structure is useful if the user needs to see the same model element simultaneously in different contexts and/or from different viewpoints.
In specifications, Murphy's Law supersedes Ohm's.
Hallo kbr und pillmuncher,
trennen tue ich sowieso alles. Ich habe für jede ui-Datei ein Modul, die dafür sorgt, dass diese Dateien dynamisch geladen werden. Dort werden dann auch Einstellungen für das ui-Fenster festgelegt. Und dann habe ich zum Beispiel für das Arbeiten mit MySQL ein extra Modul, worin die Verbindungsfunktion, das Auslesen der Daten, das Speichern der Daten etc abgewickelt wird. Also vermischen werde ich nichts. Das haben mir die Leute, unter anderem pillmuncher, BlackJack, jerch, Hyperion etc mit eingebleut und es sitzt. Aber beim MVC geht es noch einen Schritt weiter, soweit ich es verstanden habe. Das heißt, wenn man mehrere GUI-Fenster offen hat, und man nimmt im einen Fenster eine Veränderung durch, dann werden diese dann auf all die anderen Fenster zeitgleich angezeigt. Dazu habe ich ja ein Beispiel gleich auf der ersten Seite des Thema, gleich im 11. Beitrag. Aber dort hängt alles vom Qt-Rahmenwerk ab, und ich fragte mich, ob das auch ohne Qt-Rahmenwerk möglich ist, und dabei konzentriere ich mich auf den Model.
Wir sehen hier also, dass das Model eine QStringListModel-Klasse ist, also eine Klasse vom Qt. Was ist aber, wenn ich mich später mit tkinter auseinander setzen sollte? Dann muss der ganze Model wieder überarbeitet werden. Ich weiß nicht wie man sowas unter tkinter bewerkstelligt, jedoch denke ich, ist es wieder ganz anders. Und da sehe ich einfach eine Abhängigkeit. Und das ist eben, was mich ein Bisschen wurmt.
trennen tue ich sowieso alles. Ich habe für jede ui-Datei ein Modul, die dafür sorgt, dass diese Dateien dynamisch geladen werden. Dort werden dann auch Einstellungen für das ui-Fenster festgelegt. Und dann habe ich zum Beispiel für das Arbeiten mit MySQL ein extra Modul, worin die Verbindungsfunktion, das Auslesen der Daten, das Speichern der Daten etc abgewickelt wird. Also vermischen werde ich nichts. Das haben mir die Leute, unter anderem pillmuncher, BlackJack, jerch, Hyperion etc mit eingebleut und es sitzt. Aber beim MVC geht es noch einen Schritt weiter, soweit ich es verstanden habe. Das heißt, wenn man mehrere GUI-Fenster offen hat, und man nimmt im einen Fenster eine Veränderung durch, dann werden diese dann auf all die anderen Fenster zeitgleich angezeigt. Dazu habe ich ja ein Beispiel gleich auf der ersten Seite des Thema, gleich im 11. Beitrag. Aber dort hängt alles vom Qt-Rahmenwerk ab, und ich fragte mich, ob das auch ohne Qt-Rahmenwerk möglich ist, und dabei konzentriere ich mich auf den Model.
Code: Alles auswählen
from PyQt4 import QtGui, QtCore, uic
import sys
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
app.setStyle("cleanlooks")
#DATA
data = QtCore.QStringList()
data << "one" << "two" << "three" << "four" << "five"
listView = QtGui.QListView()
listView.show()
model = QtGui.QStringListModel(data)
listView.setModel(model)
combobox = QtGui.QComboBox()
combobox.setModel(model)
combobox.show()
listView2 = QtGui.QListView()
listView2.show()
listView2.setModel(model)
sys.exit(app.exec_())
Der Link ist gut.pillmuncher hat geschrieben:Hier steht mehr dazu: http://heim.ifi.uio.no/~trygver/themes/ ... index.html
Ich denke für ein sinnvolles MVC-Beispiel braucht es etwas mehr, als 5 Strings ohne wesentliche Interaktionsmöglichkeit darzustellen.
Bei einem guten MVC-Beispiel sollte das Model
- nicht trivial sein,
- es mehr als eine View geben,
- der Benutzer sollte was machen können
- und trotzdem sollte das ganze nicht zu komplex sein.
Die Verzeichnisse und die Dateien sind das Model. Es gab drei Views: die Verzeichnisstruktur als Baum, den Inhalt eines Verzeichnisses als Tabelle und die Properties einer Datei in einem Formular. Wenn man im Baum herumgeklickt hat, dann hat die Tabelle das aktuelle Verzeichnis angezeigt und wenn man in der Tabelle herumgeklickt hat, dann hat das Formular die Properties der aktuellen Datei angezeigt.
Anhand so eines Beispiels wird die Funktionsweise von MVC und die Vorteile von Qt deutlich (im Java-Kurs natürlich nicht Qt, sondern Swing). Insbesondere was ein Model ist und was nicht:
Wenn der Inhalt eines Verzeichnisses als Tabelle dargestellt wird, dann ist die Tabelle die View. Wer mit Qt arbeitet, der entwickelt aber keine Tabellen, die gibt es schon als Klasse, sondern man implementiert die Ansicht seiner Daten (dem Model), indem man von QAbstractTableModel ableitet. Für Qt ist das ein Model für die Dateibrowser-Anwendung ist das aber Teil der View. Denn eine MVC Anwendung hat zwar in der Regel mehrere Views, auch der Controller kann auf mehrere Teile aufgteilt werden, aber es gibt nur ein Model. Für die Baumansicht der Verzeichnisstruktur wird von QAbstractItemModel abgeleitet, auch das ist für Qt ein Model, für die Dateibrowser-Anwendung gehört es aber zur View.
So wie MagBen es schildert, so hatte ich das MVC-Konzept auch verstanden. In einem Fenster wird etwas verändert, und dies wird dann auf all die anderen Fenster übertragen, und das mittels Model. Aber diese Konstellation habe ich momentan nicht.
Ich habe ein Fenster, auf dem Combobox, lineEdit, Button und eine treeWidget vorhanden sind. Bei einer Suche werden dann entsprechende Daten ausgegeben. Mit einem Doppelklick öffnet sich ein weiters Fenster, in denen detaillierte Informationen über einen bestimmten Datensatz angezeigt werden. Man kann über das Fenster bestimmte Detail-Informationen ändern. Um es konkret zu machen, kann ich hier das Beispiel mit der Film-Datenbank angeben. Über das treeWidget werden Filmtitel ausgegeben. Wenn ich im anderen Fenster einen Filmtitel ändere, dann kann ich diese Aufgabe auch mittel pyqtSignals arbeiten und brauche dazu kein MVC-Konzept oder?
Ich habe ein Fenster, auf dem Combobox, lineEdit, Button und eine treeWidget vorhanden sind. Bei einer Suche werden dann entsprechende Daten ausgegeben. Mit einem Doppelklick öffnet sich ein weiters Fenster, in denen detaillierte Informationen über einen bestimmten Datensatz angezeigt werden. Man kann über das Fenster bestimmte Detail-Informationen ändern. Um es konkret zu machen, kann ich hier das Beispiel mit der Film-Datenbank angeben. Über das treeWidget werden Filmtitel ausgegeben. Wenn ich im anderen Fenster einen Filmtitel ändere, dann kann ich diese Aufgabe auch mittel pyqtSignals arbeiten und brauche dazu kein MVC-Konzept oder?
@Sophus: Das Modell brauchst du eigentlich nur, wenn du mit strukturierten Daten hantierst (oft in Form von Datenbanktabellen). Falls aber lediglich ein bißchen Text in 2 verschiedenen Fenstern erscheinen soll oder eben Änderungen am Text zwischen den Fenstern übernommen werden sollen, dann geht das in der Tat auch mit Signals. Dann wäre MVC sogar totaler Overkill, sofern es wirklich nur um ein einzelnes Textfeld geht.
Aber da du ja was von einer Filmdatenbank schreibst, ist MVC eigentlich schon ganz sinnvoll. Die Änderung des Filmtitels wird dann halt direkt ins Modell geschrieben. Anschließend wird dein View benachrichtigt (über ein Signal), dass es Änderungen am Modell gab. Der View würde daher seine Anzeige aktualisieren. Das wäre MVC-typisches Verhalten.
Aber da du ja was von einer Filmdatenbank schreibst, ist MVC eigentlich schon ganz sinnvoll. Die Änderung des Filmtitels wird dann halt direkt ins Modell geschrieben. Anschließend wird dein View benachrichtigt (über ein Signal), dass es Änderungen am Modell gab. Der View würde daher seine Anzeige aktualisieren. Das wäre MVC-typisches Verhalten.