Каков «правильный» способ изолировать управляющие зависимости - PullRequest
1 голос
/ 27 февраля 2009

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

Однако два недавних проекта изменили мое мнение о практике. Во-первых, нам нужно было согласованное событие «ValueChanged», чтобы мы могли легко реализовать «грязный» флаг в наших формах без массивного оператора switch для выбора между событием TextChanged в Textbox или SelectedIndexChanged из ListBox и т. Д. мы просто хотели услышать одну последовательную вещь для всех элементов управления, и подклассы встроенных элементов управления купили нас довольно легко.

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

Итак, вот мой вопрос: каковы относительные сильные и слабые стороны

  1. Простое добавление класса и его наследование от элемента управления.
  2. Добавление нового «Пользовательского элемента управления» и наследование.
  3. Добавление нового «Компонента» и наследование.

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

Примечание: у меня уже есть личное мнение о том, что это "правильно", но я хочу посмотреть, что думает мир.

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

Если оба 1 и 2 наследуются, то они функционально идентичны, нет? Должен ли один из них инкапсулировать элемент управления? В этом случае вам нужно добавить много проходных участников. Я бы не рекомендовал это.

В личном плане я просто не стал бы добавлять дополнительное наследование без очень веской причины ... например, «измененное событие» могло бы быть обработано с некоторыми перегрузками и т. Д. В C # 3.0 это становится еще чище благодаря методам расширения - то есть вы можете иметь такие вещи, как:

public static AddChangeHandler(
        this TextBox textbox, EventHandler handler) {
    testbox.TextChanged += handler;
}
public static AddChangeHandler(
        this SomethingElse control, EventHandler handler) {
    control.Whatever += handler;
}

и просто используйте myControl.AddChangeHandler(handler); (полагаясь на статический тип myControl для разрешения соответствующего метода расширения).

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

0 голосов
/ 02 марта 2009

Я пользуюсь композицией. Я просто создаю новый UserControl и добавляю нужные мне элементы управления. Это прекрасно работает, потому что:

  • В любом случае, я никогда не использую столько свойств, поэтому методы передачи сводятся к минимуму.
  • Я могу начать с наивного подхода и уточнить его позже.
  • Свойства внешнего вида должны быть единообразными для всего сайта. Теперь я могу установить их раз и навсегда.
...