C # winforms: мое разделение GUI и логики сделано правильно? - PullRequest
1 голос
/ 20 мая 2009

Редактировать

Исходя из приведенных ниже предложений по отправке делегатов 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();  

1 Ответ

3 голосов
/ 20 мая 2009

У меня не будет круговой ссылки между формой и searchCore. почему вы не заставляете логику поиска возвращаться к форме через обратный вызов? таким образом, поиск не должен знать о форме и его легче тестировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...