Шаблоны проектирования для C # Windows Forms - PullRequest
1 голос
/ 08 февраля 2012

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

Затем я опишу программу.

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

Например:

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

Теперь проблема.

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

Может кто-нибудь предложить шаблон проектирования (особенно широко используемый), который управляет этим чисто?

В случае, если этоУместно, я думаю о чем-то вроде этого:

  • Модель объекта:
    • Класс MyForm: сама форма.
    • Класс FormController:
      • Childкласс MyForm.
      • Для создания экземпляра требуется объект типа MyForm.
      • Задача FormController - перевести его объект MyForm в определенное «состояние», включив / отключив элементы управления, отображая различный текст и т. Д.
      • FormController предоставляет небольшой набор открытых функций, которые имеют дело ссемантически высокоуровневый запрос состояния формы (например, «DisplayNewQuestion (QuestionData d)»)
    • Сеанс класса: содержит все базовые постоянные данные или объекты, связанные с этим сеансом, включая списки возможныхвопросы, объекты, которые выбирают следующий вопрос из списка, и т. д.
    • Драйвер класса: Управляет как объектами Session, так и FormController.Например, он запросит у объекта Session новый вопрос и передаст его объекту FormController для обновления формы.

Преимущество чего-то подобного заключается в том, что ickyкод формы и красивый логический код теперь полностью разделимы.Но стоит ли?Есть ли лучшие или более распространенные шаблоны дизайна для этого?

Спасибо за тонну!

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Возможно, вы захотите использовать шаблон проектирования Model-View-Controller (MVC) , в котором «логика» - это ваш контроллер, а «представление» - это ваш пользовательский интерфейс. Модель используется для доступа и извлечения данных из вашего источника данных (например, базы данных SQL)

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

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

2 голосов
/ 08 февраля 2012

В этой ситуации мне всегда удобнее с Model View Controller.Разработчик Shade Tree написал самую информированную серию, которую я когда-либо читал на эту тему: см. Здесь

Суть MVC

Модель содержитданные для отображения

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

Контроллер содержит клей для созданиявсе это происходит, включая бизнес-логику.

Зависимости должны быть

Модель не знает о представлении или контроллере

Представление знает о модели и знает, как извлечь из нее данные для отображения.

Контроллер знает о модели и представлении, создает их экземпляры и соединяет их вместе.

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

Представление вызывает событие, когда происходит взаимодействие с пользователем, контроллер захватывает это событие и выполняет совместную работу.Правильное действие для взаимодействия, будь то обновление модели, сохранение или очистка или что-то еще.

Представление не должно записывать в саму модель

Вы увидите много кода, где создается формаконтроллер, но имо это неправильно.Это произошло из-за того, что люди пытались применить этот шаблон в веб-формах asp.net, где у вас нет контроля над жизненным циклом, первое, что всегда создавалось, было представление, поэтому у вас не было выбора, кроме как создать контроллер, однако вwinforms, которые вы контролируете, так что сделайте его чистым, попросите контроллер создать представление.

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