2009-08-02 27 views
0

Ich entwickle eine Windows Forms-Anwendung. Es wurde im Grunde mit einer Mischung aus BDUP und Prototyping evidenziert.Refactoring Windows Forms-Anwendung

Ich habe etwa 1500 Zeilen Code (außer IDE generiert teilweise Klasse ... 1465 um genau zu sein) in das Formular und das Formular hat 6 Registerkarten (9 Unterregister). Es enthält nicht mehr als 10 Steuerelemente in jeder Form, sodass eine Mehrfachformel-Lösung ein Overkill wäre.

Ich habe eine Reihe von Entitätsklassen, die bei der Serialisierung geben Sie mir eine XML-Darstellung, die ich in einer XML-Datei speichern. Ich habe dies mit einem Repository-Muster gekapselt, damit ich den Speicher in Zukunft in eine Datenbank verschieben kann. Das Formular verwendet die Entitätsklassen (zum Speichern/Bearbeiten) und die Repo-Factory (Hinzufügen, Abrufen und Speichern).

Jetzt ist mein Problem, dass viel von den 1500 Zeilen Code die Interaktion zwischen UI-Elementen behandelt (eine Auswahl in einer Combo macht einige Elemente deaktiviert, oder zeigt verschiedene Elemente in einem Raster an, Registerübergänge handhaben (next/back buttons)), Lade Menüs (jedes einzelne Element in der xML-Datei-Repository wird ein Menüpunkt), neue/Editier-Modus usw. (ich habe drei verschiedene Sätze von neuen/bearbeiten auf der gleichen Form).

  1. Was wäre Der beste Ansatz hier, um die Interaktion des Elements zu verschieben Lassen Sie mich sagen, dass ich mich entscheide, es in Zukunft webbasiert zu machen.
  2. Noch wichtiger, was sind die Composite Refactorings, die ich anwenden kann?
  3. Welche Muster sollte ich umgestalten/Richtung?

Vielen Dank für Ihre Hilfe.

Hinweis: Ich lese Refactoring zu Patterns ... Speziell ich eine "Howto"/Tipps Refactoring zu MVC ...

+0

Sie sind sicher begeistert von Mustern. – Eric

+0

@Eric: Ja, bin ich. :) Ich verstehe auf der konzeptionellen Ebene, Trennung von Interessen ist, was Muster sind. Es dauert jedoch eine Weile [auch wenn Sie denken, dass Sie das Muster gut kennen], um die "Aha" -Erfahrung zu bekommen [zu wissen, wann man etwas anwenden muss, was manchmal sehr subtil ist]. –

Antwort

0

Sie sollten schauen in die Model-View-Controller (MVC haben wollte) Entwurfsmuster, um Ihre Geschäftslogik von Ihrer Anzeigelogik zu abstrahieren.

Es gibt auch einen anderen Geschmack der gleichen Sache, der Model View Presenter.

Beide sind ausführlich im Netz dokumentiert.

Grüße, Joon

+0

@Joon: Ich kannte das Muster ... Ich lese Refactoring zu Patterns ... und ich wollte ein "Howto" zum Refactoring zu MVC haben ... Ich habe die Frage so bearbeitet, dass sie dasselbe widerspiegelt. –

+0

Vyas - Ich habe herausgefunden, dass der Datenzugriff am einfachsten ist. Also erster Schritt: Stellen Sie Ihren gesamten Datenzugriff hinter ein Datenzugriffsobjekt. Als nächstes verschieben Sie die Aufrufe an Ihr DAO über eine Model-Klasse. Dann verschieben Sie Ihre "reine" Geschäftslogik, wie Berechnungen, Validierungsbeschränkungen etc. in diese Modellklasse. Sie sollten jetzt Ihre typische 3-Schicht-App mit Frontend, Business-Schicht und DAO haben Die Logik, die übrig ist Das Frontend wird dann in eine Controller-Klasse verschoben und die UI-Widgets interagieren nur mit der Controller-Klasse, die wiederum auf das Modell zugreift. – Joon

+0

@Joon: Ja, für Anwendungen, die eine Datenbank und Geschäftslogik beinhalten (z. B. Gehalt> 60.000 USD beinhaltet Bonus von 5%), ist es einfacher, Präsentation, Geschäft und Daten abzugrenzen. Hier ist es mehr von dem, was MSFT P & P [UI Process Components] nennt. Ich werde mehr über MVP/MVC lesen und die Refactoring-Sitzung in meinem Blog veröffentlichen. Danke für deinen Beitrag. –

2

Martin Fowler beschreibt verschiedene UI-Architekturmuster in this article. Es ist ziemlich lang, aber es lohnt sich, es zu lesen. Sie können dann bestimmen, welche Muster und Architekturmodelle am besten zu Ihrem Szenario passen.

Am Ende des "Model View Controller" Abschnitt of that article erwähnt Fowler diese Elemente, die für Sie in scheinen:

  • eine starke Trennung zwischen Präsentation Stellen (Ansicht & Controller) und Domäne (Modell) - Getrennte Präsentation.
  • Teilen Sie GUI-Widgets in einen Controller (um auf Benutzeranregung zu reagieren) und sehen Sie (um den Status des Modells anzuzeigen). Controller und Ansicht sollten (meistens) nicht direkt kommunizieren, sondern über das Modell.
  • Lassen Sie Views (und Controller) das Modell beobachten, damit mehrere Widgets aktualisiert werden können, ohne dass sie direkt kommunizieren müssen - Observer Synchronization.

Siehe den Artikel und seine Links für weitere Informationen. Viel Glück!

+1

@Chris: Ich habe dieses GUI Arch Paper von Fowler ziemlich oft zurück gelesen. Aber die Verbindung irgendwo verlegt [oder nicht gründlich gesucht;) Ich habe StackOverflow jetzt]. Danke für den Link. –

+0

@Vyas: Es freut mich, ich bin froh, dass es geholfen hat. –