Hallo Ihr!
Nachdem ich mir heute in der Software Engineering Vorlesung einiges über Softwareentwürfe angehört habe, wollte ich mich nun einmal dransetzen, und versuchen mir klar zu machen, wie ich meine eigenen Projekte eleganter gestalten kann. Das ganze nun aber exemplarisch an einer Swing-Applikation, bei der die Umsetzung nach dem MVC-Muster ja etwas schwammiger ist, als es beispielsweise bei Web-Applikationen der Fall ist. Bei meinen Projekten, die ich in PHP z.B. mit dem Zend Framework entwickel, fällt mir das ganze zumindest um einiges leichter.
Ich gehe nun einmal von einer "Anwendung" aus, mit der ich Daten aus einer Excel-Datei laden kann, quasi etwas wie einen JExcelFileLoader. Die genauen Details der API wie z.B. JExcel lasse ich nun einmal aussen vor.
Als erstes müsste ich einmal klären, was meine einzelnen Teile des MVC-Musters wären, wobei es ja Usus ist, den Controller und die View in ein Delegate zu verfassen. Dieses Delegate soll nun also etwas einen JDialog sein, der eine JTable enthält, sowie unterschiedliche andere Komponenten, die der Benutzerinteraktion dienen. Das ganze könnte nun etwas z.B. so aussehen:
Der View-Part stellt in dem Fall der Dialog mit den einzelnen Komponenten und deren Listener für die Interaktion mit dem Benutzer dar.
Den Controller-Part stellen nach meinem Erachten nun diverse Methoden der Anwendungslogik dar.
Beispiel: Der Benutzer klickt auf "Datei öffnen", wobei der Button und seine Reaktion auf den Klick noch zur View gehören. Letztendlich sorgt der Listener dafür, dass ein JFileChooser geöffnet wird, mit dem der Benutzer eine Datei auswählen kann, und nimmt diese entgegen.
Nun würde ich so weiter vorgehen, dass der Listener eine Methode aufruft, die schon zum Teil des Controller des Delegates gehört, also beispielsweise eine Methode loadFile(File file). Diese Methode übergibt die Datei beispielsweise an einen ExcelReader, der hier nicht näher erläutert ist, und erhält als kleines Dankeschön den Inhalt der Excel-Tabelle als ein zweidimensionales String[][]-Array zurück.
Doch hier kommt nun eine Stelle, bei der ich mir nicht mehr ganz so sicher bin, wo meine Daten genau hingehören.
Dieses String-Array stellt ja die Daten dar, die eigentlich zum Model meines JExcelLoader gehören. Dementsprechend könnte ich nun eine weitere Klasse ExcelLoaderModel erstellen, welcher ich nun diese Daten zur Verfügung stelle.
Andererseits sollen die Daten ja in der JTable angezeigt werden, und diese werden ja nun somit in das TableModel der Tabelle gespeichert.
Somit müsste ich meine Daten ja eigentlich an zwei Stellen übergeben: An das Model des ExcelLoaders, und an die JTable bzw. deren Model, die ja aber eigentlich zur View-Komponente gehören, d.h. ich speicher meine Model-Daten in der View.
Was wäre denn wohl der sinnvollste Weg, den ich gehen sollte? Ich weiß, dass dies nun vll. der berühmte Schuss mit Kanonen auf Spatzen ist, aber es geht mir eigentlich ums Prinzip. Zumindest ist mir die MVC-Umsetzung in Desktop/Swing-Applikationen nicht ganz klar.
Vll. kann der ein oder andere ja mal ein paar Kommentare abgeben.
Nachdem ich mir heute in der Software Engineering Vorlesung einiges über Softwareentwürfe angehört habe, wollte ich mich nun einmal dransetzen, und versuchen mir klar zu machen, wie ich meine eigenen Projekte eleganter gestalten kann. Das ganze nun aber exemplarisch an einer Swing-Applikation, bei der die Umsetzung nach dem MVC-Muster ja etwas schwammiger ist, als es beispielsweise bei Web-Applikationen der Fall ist. Bei meinen Projekten, die ich in PHP z.B. mit dem Zend Framework entwickel, fällt mir das ganze zumindest um einiges leichter.
Ich gehe nun einmal von einer "Anwendung" aus, mit der ich Daten aus einer Excel-Datei laden kann, quasi etwas wie einen JExcelFileLoader. Die genauen Details der API wie z.B. JExcel lasse ich nun einmal aussen vor.
Als erstes müsste ich einmal klären, was meine einzelnen Teile des MVC-Musters wären, wobei es ja Usus ist, den Controller und die View in ein Delegate zu verfassen. Dieses Delegate soll nun also etwas einen JDialog sein, der eine JTable enthält, sowie unterschiedliche andere Komponenten, die der Benutzerinteraktion dienen. Das ganze könnte nun etwas z.B. so aussehen:

Der View-Part stellt in dem Fall der Dialog mit den einzelnen Komponenten und deren Listener für die Interaktion mit dem Benutzer dar.
Den Controller-Part stellen nach meinem Erachten nun diverse Methoden der Anwendungslogik dar.
Beispiel: Der Benutzer klickt auf "Datei öffnen", wobei der Button und seine Reaktion auf den Klick noch zur View gehören. Letztendlich sorgt der Listener dafür, dass ein JFileChooser geöffnet wird, mit dem der Benutzer eine Datei auswählen kann, und nimmt diese entgegen.
Nun würde ich so weiter vorgehen, dass der Listener eine Methode aufruft, die schon zum Teil des Controller des Delegates gehört, also beispielsweise eine Methode loadFile(File file). Diese Methode übergibt die Datei beispielsweise an einen ExcelReader, der hier nicht näher erläutert ist, und erhält als kleines Dankeschön den Inhalt der Excel-Tabelle als ein zweidimensionales String[][]-Array zurück.
Doch hier kommt nun eine Stelle, bei der ich mir nicht mehr ganz so sicher bin, wo meine Daten genau hingehören.
Dieses String-Array stellt ja die Daten dar, die eigentlich zum Model meines JExcelLoader gehören. Dementsprechend könnte ich nun eine weitere Klasse ExcelLoaderModel erstellen, welcher ich nun diese Daten zur Verfügung stelle.
Andererseits sollen die Daten ja in der JTable angezeigt werden, und diese werden ja nun somit in das TableModel der Tabelle gespeichert.
Somit müsste ich meine Daten ja eigentlich an zwei Stellen übergeben: An das Model des ExcelLoaders, und an die JTable bzw. deren Model, die ja aber eigentlich zur View-Komponente gehören, d.h. ich speicher meine Model-Daten in der View.
Was wäre denn wohl der sinnvollste Weg, den ich gehen sollte? Ich weiß, dass dies nun vll. der berühmte Schuss mit Kanonen auf Spatzen ist, aber es geht mir eigentlich ums Prinzip. Zumindest ist mir die MVC-Umsetzung in Desktop/Swing-Applikationen nicht ganz klar.
Vll. kann der ein oder andere ja mal ein paar Kommentare abgeben.