logo
03

Сохраняйте гибкость

Помните о том, что проще, дешевле и удобнее создать и сопровождать один настраиваемый контрол, чем десяток похожих контролов, отличающихся незначительными деталями отрисовки или поведения. Однако же не увлекайтесь созданием суперуниверсальных монстров, умеющих всё. Зачастую достаточно позволить пользователю настраивать цвета, размеры и шрифты основных частей вашего контрола. Не забывайте про различные состояния, в которых может находиться контрол, например, Selected, Pushed, Focused. Предоставьте пользователю возможность задавать альтернативное отображение контрола в некоторых состояниях. Например, для контрола вроде списка имеет смысл предоставить пользователю возможность изменить цвет, которым подсвечивается текущий элемент.

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

Предоставляйте несколько вариантов методов там, где возможен разный формат входных данных. Например, варианты (Point pt) и (int x, int y), (Rectangle rect) и (Point pt, Size size).

Предоставляйте события, информирующие клиента изменения свойств контрола. Стандартное название для события – NNNNChanged, где NNNN – имя свойства. Тип делегата должен быть EventHandler. Используя эти события, клиенты вашего класса смогут отслеживать изменения в состоянии контрола, даже если они сложно связаны. Это также позволит системе времени дизайна правильно отслеживать состояние вашего контрола. Кроме того, наличие подобных событий является необходимым условием для подключения к источнику данных в режиме read-write, иначе система Data Binding не узнает, что именно изменилось.

Создание контрола

Yandex.RTB R-A-252273-3