Как ответить на большой Form1.cs? - PullRequest
0 голосов
/ 04 сентября 2011

Я исследовал MVC и MVP, но я не уверен, что они мне нужны.

В настоящее время у меня много объектов Model, и мой вид - это основная форма (Form1.cs).

Проблема в том, что основная форма сейчас становится очень большой.Например, когда пользователь нажимает на элемент меню отмены, вызывается обработчик события undoButton_Click.Это отлично.Проблема состоит в том, что код в этом обработчике событий состоит из 10 строк (вывод отмены стека, нажатие повтора восстановления, обновление элементов управления формы и т. Д.).Это может показаться не так много, но когда в вашей форме много элементов управления, строки быстро складываются.

Я думал об этом и хочу простое решение.В идеале, когда вызывается undoButton_Click, тело метода должно быть одной строкой кода.В идеале должен быть класс (возможно, производный от интерфейса, который определяет один метод Run или что-то в этом роде), который я мог бы вызвать, чтобы выполнить эту отмену.

Проблема в том, что undoButton_Clickработает со многими элементами управления формой и переменными-членами класса.Как этот класс будет иметь доступ к этим элементам управления?Я не могу передать форму в качестве аргумента, потому что все элементы управления являются частными.Я действительно предпочитаю не делать все элементы управления общедоступными или предоставлять множество открытых свойств для доступа к ним.Даже если бы я сделал это, что из переменных-членов, которые Form1 имеет как undoStack или объект документа?

Совершенно невозможно передать все необходимые аргументы, потому что список параметров будет огромным, и если изменения когда-либо понадобятсябыть сделанным это было бы кошмаром.

Не совсем уверен, как подойти к этой проблеме.Однако я знаю, что мой Form1.cs слишком загроможден логикой и манипулированием объектами.Я просто хочу, чтобы он отвечал на события и вызывал соответствующий метод / класс для обработки события.

Спасибо за чтение и извините за стену текста.

Ответы [ 4 ]

1 голос
/ 04 сентября 2011

У меня очень похожая проблема. Мое решение заключается в создании частичных классов для моей MainForm. У меня есть один для обработчиков событий, один для обработки мыши, один для обработки клавиатуры и т. Д.

Я также переработал некоторые служебные методы, которые используются в ряде мест, в отдельный статический класс.

У меня также есть другой частичный класс для полей, которые используются в проекте. Наконец, я использую статический класс для некоторых полей и свойств, чтобы уменьшить передачу параметров в методы. Я уверен, что некоторые люди скажут мне, что это плохая практика, но она работает для меня.

Наконец, я использую надстройку для Visual Studio, которая вычисляет сложность или удобство сопровождения кода, а затем преобразует большие или сложные методы в более мелкие.

0 голосов
/ 04 сентября 2011

Вы должны попытаться удалить как можно больше логики со своего уровня пользовательского интерфейса.Когда вам нужно выполнить бизнес-логику, эта логика должна быть расположена на вашем бизнес-уровне.Пользовательский интерфейс должен знать только то, как визуально представлять ваши различные данные и выполнять команды для вашего бизнес-уровня.Вам не нужно использовать MVC для достижения этой цели.

С концептуальной точки зрения рассмотрим класс Person.Это будет иметь набор свойств (имя, адрес, имя собаки).Ваш пользовательский интерфейс будет иметь набор текстовых полей и ссылку на экземпляр человека, который он представляет.Когда в текстовое поле вносятся изменения, оно применяется к экземпляру лица.Когда вы хотите отменить, вы вызываете отмену на объекте person, и это будет до того объекта, чтобы восстановить его предыдущее состояние (и разрешить повторное выполнение).После того, как отмена завершена, пользовательский интерфейс поместит новые значения в текстовые поля, но это не должно волновать , как была выполнена фактическая отмена или повторное выполнение.

Это может быть достигнуто вручную или с помощью встроенных механизмов привязки данных в .NET.Мой главный вопрос заключается в следующем;как можно больше отделите свою логику от пользовательского интерфейса, и форма ничего не сделает, только покажет вещи на экране и выдаст команды.Всякий раз, когда операторы SQL или вычисления начинают появляться в обработчиках нажатий ваших кнопок, вы находитесь на неправильном пути.

В конкретном примере Undo вы должны взглянуть на шаблон дизайна сувенира ( здесь и здесь )

0 голосов
/ 04 сентября 2011

Я бы добавил ControlUndo класс с ctor

ControlUndo(Form parentform, string controlname, string property).

Каждый control в форме объявляет свое отменяемое свойство, передавая ctor его родительскую форму, его имя и имя свойства.

ControlUndo имеет метод Undo(), который из Controls коллекции родительской формы находит объект Control, используя отражение, находит свойство для отмены и возвращает значение.

После добавления нового ControlUndo в глобальную коллекцию не подлежащих отмене объектов. Когда Undo в форме вызывается, вам нужно только для каждого элемента в вызове коллекции Undo().

А как насчет интерфейса?

Если у вас много элементов управления в форме, вряд ли user они понадобятся одновременно. Таким образом, вы можете разделить их между различными TabPages, основываясь на логике вашего приложения, добавив в форму все элементы управления, но ограничив UI содержимым наиболее важных вещей, которые нужны пользователю в данный момент.

Надеюсь, это поможет.

0 голосов
/ 04 сентября 2011

Я не совсем понял, что должен делать ваш код, но вы должны разделить свой код на более мелкие методы, которые имеют короткий код и выполняют несколько конкретных действий каждый. когда вы дойдете до этого уровня, вы увидите, какой из них можно использовать для пары элементов управления, а какой - только для одного элемента управления. Более того, вы увидите, какие параметры нужны каждому из них, и затем вы поймете, какие из них могут быть в отдельном классе, а какие - в качестве частного метода элемента управления, а какие понадобятся в качестве специального метода для частного поля. Желаю удачи и успехов.

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