Как избежать дублирования логики на двух похожих WinForms? - PullRequest
4 голосов
/ 03 ноября 2008

У меня есть две формы, форма A и форма B. Эти формы должны отличаться по внешнему виду, но они имеют много логики. Проблема в том, что эта логика связана с внешним видом (проверка нажатия кнопки, запускаемые события и т. Д.). Например, у меня есть поле имени, и когда нажата кнопка сохранения, мне нужно вызвать событие, которое заставляет родительскую форму проверять имя записи, чтобы избежать дублирования. Обе формы нуждаются в этой логике, но их кнопки сохранения находятся в разных местах, и всплывающая подсказка, которая отображается при возникновении ошибки, также должна появляться в другом месте. Это всего лишь один пример, но кто-нибудь знает, как мне избежать копирования и вставки кода здесь? Возможно, я упускаю что-то очевидное ...

Ответы [ 5 ]

12 голосов
/ 03 ноября 2008

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

3 голосов
/ 03 ноября 2008

Вам необходимо добавить контроллер между вашими двумя представлениями и вашей общей моделью. Таким образом, вам просто нужно сделать: myController.save (); вместо этого вам нужно вызывать объект модели, чтобы сохранить их в обоих winform.

3 голосов
/ 03 ноября 2008

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

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

1 голос
/ 04 ноября 2008

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

1 голос
/ 03 ноября 2008

Есть несколько способов, которыми я могу придумать, чтобы реорганизовать эти формы для обмена логикой. Вы можете использовать один или несколько из них вместе:

  1. Создание специфичных для пользовательского интерфейса объектов "bean", которые обертывают ваш бизнес-объект и добавляют дополнительные функциональные возможности, которые совместно используются формами. Этот бин может делать такие вещи, как создание подсказок, помощь в проверке, обработке событий и т. Д.
  2. Создать вспомогательный класс с общими функциями. Обобщите логику двух форм, чтобы вызвать этот вспомогательный класс для общих функций.
  3. Расширение ваших бизнес-объектов для проверки. Я не хочу сказать, что ваши BO должны знать о любом пользовательском интерфейсе, но они могут / должны обеспечивать соблюдение бизнес-правил. Это может вытянуть некоторую логику проверки из ваших форм в общее местоположение.
  4. Создание пользовательских элементов управления, специфичных для типа данных, с которыми вы работаете, и использование этих элементов управления в двух формах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...