Магическая кнопка () — антипаттерн, появляющийся при недостатке абстракции, когда множество различных действий сваливается в кучу в неподходящем месте, например в обработчике нажатия на кнопку, вместо того чтобы быть распределёнными по подходящим классам и функциям. Обычно проблема возникает в средах визуальной разработки, когда программист сначала рисует пользовательский интерфейс, а затем пишет бизнес-логику в автоматически созданных методах, обычно — в методе обработки нажатия на кнопку, например «OK».

Проблемы этого антипаттерна: Код обработчиков элементов интерфейса неконтролируемо растёт Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным, например удаление кнопки может повлечь за собой удаление связанных с ней методов Усложняется тестирование кода Повторное использование кода невозможно

Иногда сходные антипаттерны возникают и в серверном коде, например в ASP.NET Web FormsEnterprise Integration Anti-Patterns #2 — Shared Assemblies.

Плохой пример (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).

Примечания

Литература Bruce A. Tate, Bitter Java. ISBN 193011043X, 2002. «An early antipattern: The Magic Pushbutton» page 54

Категория:Программирование Категория:Антипаттерны Категория:Программистский сленг