2009-05-20 6 views
1

編集ロジックコードGUIの代表を送信するために、以下の提案に基づいてC#winforms:GUIとロジックの分離が正しく行われていますか?

、私はこのようなコードを思い付いた:

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

がこれを短縮することが可能ですか?


ここは私のC#windowsフォームプログラムの一部です。

別のスレッドを使用するようにコードを変換し始めたとき、ロジックコードが実際にGUIを使用できるように、スレッドを生成して代理人にラップされたパブリックメソッドを作成すると、

より良いイディオムやアーキテクチャの改善についてご提案ください。ありがとうございました。

// 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それほど多くはありません。 Executeは2秒ごとに出力される長時間実行される方法(2分以上)です。 – Unknown

+0

あなたは何を達成したいと考えていますか?かなりの設計上の欠陥がありますが、どこに行きたいか理解するまでは間違った方向に向かわせたくありません。たとえば、単にUIを反応させようとしていますか? – senfo

+0

申し訳ありませんが、私はコメントを削除して追加しました。 – senfo

答えて

3

フォームとsearchCoreの間に循環参照はありません。 検索ロジックをコールバックを通じてフォームに戻すのはなぜですか?その方法では、検索はフォームについて知る必要はなく、テストするのが簡単です。

+0

検索ロジックをコールバックを介して戻す方法を教えてください。私はフォームでやっていることではない?インヴォーク? – Unknown

+0

私はアリと同意します。私は、SearchCoreクラスがUIを扱わないように、あるいは少なくともform1のUI要素を扱わないように、あなたのアプリケーションの機能性を分離しようとします。 ExecuteメソッドにFormパラメーターを渡すのではなく、一度検索が完了すると呼び出すことができるデリゲートを渡し、Form1クラスが必要なUI操作を実行できるようにします。 – sipwiz

+0

Passこれらの2つの関数をSearchCoreにパラメータとして代入し、+ =を使用してGUIに登録します。代理人をあなたの検索から呼び出すことができます。 –

関連する問題