Изоляция WinForms MenuStrip для улучшения сопровождения кода

В Windows Forms, С#, .NET 3.5, VS2008...

Каков хороший способ изолировать код для MenuStrip (или любой сложной группы управления) и его дочерних элементов меню от остальной части моей формы?

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

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

Согласно Code Metrics, форма нарушает следующие рекомендации:

  1. Слишком большая связь классов
  2. Слишком много строк кода
  3. Общая низкая ремонтопригодность

Возможные решения для изоляции MenuStrip от остальной части формы:

  1. Вставьте его в UserControl
  2. Другие идеи?

person Adam Kane    schedule 25.06.2010    source источник
comment
Поместите атрибут [GeneratedCode] в метод InitializeComponent.   -  person Hans Passant    schedule 26.06.2010


Ответы (2)


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

Убедитесь, что ваши метрики кода не касаются сгенерированного кода, или не обращайте внимания на плохие метрики в автоматически сгенерированном коде.

person STO    schedule 25.06.2010

Можете ли вы, например, отключить или отфильтровать CodeMetrics от захвата *.Designer.cs?

Если нет, я бы использовал класс Factory, чтобы вы могли создавать эти структуры в одну строку. Обратной стороной этого является то, что это снижает функциональность конструктора. В фабрике вы можете назвать каждый компонент на основе строки шаблона + «_FileMenu», например, чтобы вы могли установить базовое «имя» в конструкторе фабрики.

Чтобы уменьшить поток кода в файле Form.cs, рассмотрите больше подхода MVC, чтобы, когда конструктор генерирует, скажем, метод private void button1_Click, вы абстрагировали некоторую бизнес-логику для других методов других классов. Таким образом, вместо того, чтобы перемещать все ваши файлы, button1_Click вызовет, например, InitiateMoveFileMethod( string source, string destination ).

person maxwellb    schedule 25.06.2010