2009-05-20 10 views
1

bearbeitenC# winforms: Ist meine Trennung von GUI und Logik korrekt?

Basierend auf Anregungen unter der logischen Code GUI Delegierten zu schicken, kam ich mit Code wie folgt auf:

Action ClearFunction = new Action(()=>Invoke(new Action(delegate() { ResultsBox.Clear(); }))); 

Ist es möglich, dies zu verkürzen?


Hier ist ein Teil meiner C# Windows Forms Programm.

Als ich anfing, den Code in einen anderen Thread zu konvertieren, begann er sich sehr unhandlich zu fühlen, als ich Threads erzeugte und öffentliche Methoden in Delegaten erstellte, sodass der Logikcode tatsächlich die GUI verwenden konnte.

Bitte geben Sie Vorschläge für bessere Idiome oder Verbesserungen der Architektur. Vielen Dank.

// form1.cs 
    public void ClearResultsBox() 
    { 
     ResultsBox.Clear(); 
    } 

    public void PrintResults(string s) 
    { 
     ResultsBox.AppendText(s); 
    } 

    private void SearchButton_Click(object sender, EventArgs e) 
    { 
     var t = new Thread(() => SearchCore.Execute(DirectoryBox.Text, SearchBox.Text, this)); 
     t.Start(); 
    } 

    // logic.cs 
class SearchCore 
{ 
    delegate void ClearFunction(); 
    delegate void AppendFunction(string a); 

    static ClearFunction clear; 
    static AppendFunction print; 

    public static void Execute(string path, string searchterm, MainForm form) 
    { 
     clear = new ClearFunction(() => form.Invoke(new ClearFunction(form.ClearResultsBox))); 
     print = new AppendFunction(s => form.Invoke(new AppendFunction(form.PrintResults), s)); 

     clear(); 
+0

@senfo gibt es nicht wirklich viel mehr. Execute ist eine lange laufende Methode (2+ Minuten), die alle paar Sekunden ausgegeben wird. – Unknown

+0

Könnten Sie bitte etwas mehr Details darüber geben, was Sie erreichen möchten? Sie haben einige ziemlich große Konstruktionsfehler, aber ich möchte Sie nicht in die falsche Richtung lenken, bis ich verstehe, wohin Sie gehen möchten. Versuchen Sie zum Beispiel einfach, die Benutzeroberfläche ansprechbar zu halten? – senfo

+0

Entschuldigung, ich habe meinen Kommentar gelöscht, um ihn hinzuzufügen. – senfo

Antwort

3

Ich hätte keinen kreisförmigen Verweis zwischen dem Formular und SearchCore. Warum lässt du die Suchlogik nicht durch einen Callback zurück zur Form bringen? Auf diese Weise muss die Suche nicht über die Form informiert werden und ist einfacher zu testen.

+0

Wie stelle ich die Suchlogik über einen Rückruf zurück? Ist das nicht, was ich mit form mache? Invoke? – Unknown

+0

Ich würde Ali zustimmen. Ich würde versuchen, die Funktionalität in Ihrer App so zu trennen, dass die SearchCore-Klasse nicht mit der Benutzeroberfläche oder zumindest nicht mit den Elementen der Benutzeroberfläche in form1 arbeitet. Statt einen Form-Parameter an die Execute-Methode zu übergeben, übergeben Sie einen Delegaten, der nach Abschluss der Suche aufgerufen werden kann und der Form1-Klasse alle erforderlichen UI-Manipulationen ermöglichen. – sipwiz

+0

Übergeben Sie Delegaten an diese beiden Funktionen in Ihren SearchCore als Parameter und verwenden Sie + = registrieren Sie sie in Ihrer GUI. Dann können Sie die Delegierten von Ihrer Suche anrufen. –

Verwandte Themen