Alexey 的个人资料Life vs. Programming照片日志列表更多 ![]() | 帮助 |
|
5月31日 Команда, просто команда.Давно ничего не писал - другие мысли в голове, но в за последние дни уже несколько раз сталкивался с различными странными способами решения одной и той же "проблемы". "Проблема" эта состоит в следующем: необходимо динамически добавлять пользовательские элементы управления на форму. Естественно, эти элементы должны как-то реагировать на то, что делает с ними пользователь. Задача стара как мир, но каких только способов решения ее не увидишь... Сегодня, например, я даже столкнулся с таким совершенно экзотическим способом: разработчик наследовался от кнопки для того, чтобы определить ее поведение. То есть у него были такие наследники, как, скажем, SettingsButton, DeleteButton и т.д. Экземпляры этих кнопок создавались и передавались контролу, который их внутри себя размещал. Сначала я не знал, смеяться мне или плакать, но потом решил, что, поскольку создавшего это я не знаю, то все же посмеюсь. Заодно и напишу о том, как эту задачу правильно решать. Ничего нового я не скажу и те, кто при слове "Команда" уже все поняли, дальше могут не читать. Итак, нам нужно разделить, а точнее, не допустить смешения public abstract class CommandBase Допустим, у нас есть контрол, в который динамически должны добавляться кнопки, нажимая на которые пользователь будет вызывать наши функции. private void RegisterButton(CommandBase command) А потом просто использовать этот метод там, где мы "наполняем" пользовательский интерфейс: MyProfileCommand profileCmd = new MyProfileCommand(currentUser);Navigator.RegisterButton(profileCmd); MainMenu.RegisterMenu(profileCmd); Создание пользовательского элемента на основании команды можно вынести в фабрику, в сервис или придумать что-то еще. Важно то, что мы не делаем в нашем коде микс из логики и элементов управления и то, что мы всегда можем использовать одну и ту же команду несколько раз, вызывая ее из разных элементов пользовательского интерфейса или из недр нашего приложения, поведение легко контроллируется, код легко поддерживается. Здесь я привел наверное самый примитивный вариант использования этого простого подхода. Немного расширив его можно получить очень неплохой результат, но, прошу вас, не прибегайте в ваших приложениях ко всяческим экзотическим подходам в виде наследования кнопок, хранилища делегатов или писанине всей логики приложения в функциях типа button1_Click(..) :) 引用通告此日志的引用通告 URL 是: http://patrol02.spaces.live.com/blog/cns!430EDF394C126296!650.trak 引用此项的网络日志
|
|
|