- Магическая кнопка
-
В этом разделе не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 12 мая 2011.Значимость предмета статьи поставлена под сомнение. Пожалуйста, покажите в статье значимость её предмета, добавив в неё доказательства значимости по частным критериям значимости или, в случае если частные критерии значимости для предмета статьи отсутствуют, по общему критерию значимости. Подробности могут быть на странице обсуждения.- Дата постановки шаблона: 28 июня 2010
Магическая кнопка (англ. Magic pushbutton) — это анти-паттерн, очень распространённый в средах визуальной разработки. В этом случае программист сначала рисует пользовательский интерфейс, а затем пишет бизнес-логику в автоматически созданных методах.
Проблемы этого анти-паттерна:
- Код обработчиков элементов интерфейса неконтролируемо растёт
- Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным
- Усложняется тестирование кода
Плохой пример (Borland Delphi)
procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg := TRegistry.Create; try reg.RootKey := HKey_Current_User; if reg.OpenKey('SoftwareMyCompany', true) then begin reg.WriteString('Filename', Edit1.Text); end; finally reg.Free; end; end;
Хороший пример (Borland Delphi)
В этом случае лучше будет произвести рефакторинг бизнес-логики (в этом примере — хранение имени файла в реестре) в отдельный класс.
type TPreferences = class private FFilename: String; procedure SetFilename(const Value: String); public property Filename: String read FFilename write SetFilename; procedure Load; procedure Save; end;
И воспользоваться методом этого класса «Сохранить» из обработчика нажатия кнопки:
procedure TForm1.Button1Click(Sender: TObject); begin Preferences.Save; end;
procedure TForm1.Edit1Change(Sender: TObject); begin Preferences.Filename := Edit1.Text; end;
Сейчас эта проблема стала актуальной и в Visual C# (Microsoft Visual Studio).
Ссылки
Категории:- Программирование
- Анти-паттерны
- Программистский сленг
Wikimedia Foundation. 2010.