Как избежать дублирования логики на двух одинаковых WinForms?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
537
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Хотя это правильный ответ, я не думаю, что он очень полезен для OP, учитывая этот вопрос. Некоторые ссылки на MVC, MVP и реализацию с использованием WinForms, вероятно, будут очень полезны.

cfeduke 03.11.2008 21:33

Спасибо, но я не думаю, что реализация логики типа MVC в этом одном случае была бы очень практичной на данном этапе.

Ed S. 03.11.2008 21:47

Что ж, это случай гибкости -> Усилия. (с минимальными усилиями) Вы можете просто использовать общий код в статических методах, иметь объект, совместно используемый формами, и, наконец (гибкость ++), вместо этого объект, который ВЛАДЕТ ВЛАДЕНИЕМ с формами (Контроллер).

Quibblesome 03.11.2008 21:51

Что ж, принятый ответ - это именно то, что я написал 1 час назад: наличие «контроллера», который сохраняет, действителен и все другие необходимые вам вещи, которых не должно быть в представлении (WinForm). Я не могу достаточно объяснить ...

Patrick Desjardins 03.11.2008 23:23

Это. По правде говоря, хотя я знаю основы MVC, я никогда не использовал его формально. Я все равно ставил вам +1 за помощь.

Ed S. 04.11.2008 03:11

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

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

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

Другие вопросы по теме