Какой лучший способ реализовать чистую функциональность пользовательского интерфейса в WinForms при сохранении приличной развязанной архитектуры? - PullRequest
5 голосов
/ 24 сентября 2008

Я стремлюсь реализовать функциональность пользовательского интерфейса, используя довольно самодокументируемые методы void doSomething (), т. Е. Если пользователь нажимает эту кнопку, затем выполняет это действие, затем включает этот список, отключает эту кнопку и т. Д. Это лучший подход? Существует ли лучший шаблон для общего управления пользовательским интерфейсом, т.е. как контролировать, когда элементы управления включены / отключены / и т.д. и т.д. в зависимости от ввода пользователя?

Часто я чувствую, что склоняюсь к анти-паттерну «большой класс, который делает все», так как кажется, что так много взаимодействует с «основным» классом формы. Часто, даже если я включаю частные переменные состояния в класс, которые были реализованы с использованием относительно модульной конструкции, я все равно обнаруживаю, что они растут так быстро, что это смешно.

Так могли бы люди дать мне хороший совет по созданию качественного, тестируемого, развязанного дизайна WinForms, не попадая в эти ловушки?

Ответы [ 4 ]

13 голосов
/ 24 сентября 2008

Вы можете попробовать MVP , если хотите поместить логику интерфейса в отдельный класс.

В презентере с модельным представлением, как говорят Мартин Фаулер или Майкл Фезерс, логика пользовательского интерфейса разделена на класс, называемый презентатор, который обрабатывает все вводимые пользователем данные и сообщает «тупому» виду, что и когда отображать. , Особая возможность проверки шаблона обусловлена ​​тем фактом, что весь вид может быть заменен фиктивным объектом, и таким образом презентатор, являющийся наиболее важной частью, может быть легко подвергнут модульному тестированию в изоляции.

3 голосов
/ 24 сентября 2008

использование шаблона MVP довольно хорошо с winforms.

взгляните на http://www.objectmentor.com/resources/articles/TheHumbleDialogBox.pdf

0 голосов
/ 24 сентября 2008

Одна вещь, которой я занимался в последнее время, - это использование функции частичного класса .NET для некоторых из этих более крупных форм. Если у меня есть вкладка управления с 5 различными вкладками на нем. Я создам частичные классы и назову файлы CardImportMethods.cs, ManageLookupTables.cs и т. Д., Оставив все это частью класса CentralizedForm.

Даже с помощью только логики пользовательского интерфейса, эта поломка помогла, когда дело доходит до управления этими вещами.

0 голосов
/ 24 сентября 2008

Я бы только поместил логику пользовательского интерфейса в класс Form и поместил бы логику приложения в свой собственный класс:

class Form1 : Form
 {  
    void Button1_Click
     { 
       Program.DoCommand1();
     }
 }


static class Program
{
  internal static void DoCommand1() {/* ... */}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...