Как структурировать приложения VB.NET Windows Forms

Каков наилучший способ структурирования приложения VB.NET Windows Forms, чтобы код можно было повторно использовать, и приложение можно легко расширить

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

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

Расширенные формы наследуют и расширяют этот базовый класс формы.

  • Проделана ли уже работа в этой области?
  • Существуют ли книги/статьи, в которых обсуждаются варианты, доступные по этой теме?

Ответы

Ответ 1

У меня был большой успех с этим Пассивный экран.

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

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

Уловкой для решения этого является сборка контроллера, с которой ссылается сборка формы (или EXE). Каждая форма имеет соответствующий класс в сборке. Нажатие кнопки вызовет ThisForm.ThisButton(<args>), который затем спустит объекты ниже в вашей структуре. Каждая форма реализует интерфейс, так что если класс контроллера нуждается в дополнительной информации из формы, у него есть интерфейс для его получения.

Затем для вашего unit testing вы имитируете оператора, выполняющего сложные операции, путем реализации фиктивных классов для запуска событий и подачи информации в классы контроллера. Классы контроллера не знают ничего другого, поскольку фиктивные классы реализуют все ожидаемые интерфейсы.

Существует важное исключение, и для тривиальных диалогов. Для диалогов, у которых есть несколько флажков, я чувствую, что эта организация переборщила. Я часто использую шаблон команды. Поэтому в сборке, где я определяю объекты Command, я помещаю диалог SIMPLE, связанный с этой командой. Как простой диалог должен быть, чтобы получить это лечение, зависит от вас.

Мне нравится структурировать мои приложения следующим образом.

  • Утилита - это сборка, в которой есть все, что я использую все время - математические функции, файловая функция и т.д.

  • Объекты. У этого объекта есть конкретные объекты, которые я использую для этого приложения.

  • UIFramework - определяет все формы и интерфейсы контроллера.

  • Команды. У этого объекта есть все объекты Command, которые управляют моими объектами приложения.

  • UI - объекты, реализующие интерфейсы контроллера

  • EXE - формы, которые реализуют интерфейс формы и вызывают объекты контроллера.

Ответ 2

Вы можете проверить Rocky Lhotka популярный CSLA Framework. Он обеспечивает очень структурированный способ реализации бизнес-объектов, поэтому вы можете оставить код, отличный от него, вне форм. Несмотря на то, что вы просто отделяете свою бизнес-логику, она обеспечивает встроенную отмену n-уровня, проверку, безопасность, поддержку привязки данных и т.д.

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

Ответ 3

Что-то, что может помочь много, - это использование User Controls. С помощью пользовательских элементов управления вы можете повторно использовать один и тот же интерфейс в разных формах. Кроме того, у вас может быть много пользовательских элементов управления в одной форме, поэтому, если у вас есть форма с tabcontrol с 5 вкладками, содержимое каждой вкладки может быть пользовательским элементом управления, поэтому вместо того, чтобы иметь сотни элементов управления, все перемешались в одной форме, каждый пользовательский элемент управления имеет свои собственные элементы управления и логики проверки, и вы получаете всего шесть элементов управления в форме: tabcontrol и 5 пользовательских элементов управления.

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