Магическая кнопка: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
м Bot: HTTP→HTTPS (v465) |
Спасено источников — 0, отмечено мёртвыми — 1. Сообщить об ошибке. См. FAQ. #IABot (v2.0beta15) |
||
Строка 14: | Строка 14: | ||
* Повторное использование кода невозможно |
* Повторное использование кода невозможно |
||
Иногда сходные антипаттерны возникают и в серверном коде, например в ASP.NET Web Forms<ref>[http://www.ianfnelson.com/archives/2010/12/01/shared-assemblies Enterprise Integration Anti-Patterns #2 – Shared Assemblies<!-- Заголовок добавлен ботом -->]</ref>. |
Иногда сходные антипаттерны возникают и в серверном коде, например в ASP.NET Web Forms<ref>[http://www.ianfnelson.com/archives/2010/12/01/shared-assemblies Enterprise Integration Anti-Patterns #2 – Shared Assemblies<!-- Заголовок добавлен ботом -->]{{Недоступная ссылка|date=Август 2019 |bot=InternetArchiveBot }}</ref>. |
||
== Плохой пример (Borland Delphi) == |
== Плохой пример (Borland Delphi) == |
Версия от 02:53, 11 августа 2019
Магическая кнопка (англ. magic pushbutton) — антипаттерн, появляющийся при недостатке абстракции, когда множество различных действий сваливается в кучу в неподходящем месте, например в обработчике нажатия на кнопку, вместо того чтобы быть распределёнными по подходящим классам и функциям. Обычно проблема возникает в средах визуальной разработки[1][2], когда программист сначала рисует пользовательский интерфейс, а затем пишет бизнес-логику в автоматически созданных методах, обычно — в методе обработки нажатия на кнопку, например «OK»[3].
Проблемы этого антипаттерна:
- Код обработчиков элементов интерфейса неконтролируемо растёт[3]
- Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным, например удаление кнопки может повлечь за собой удаление связанных с ней методов[4]
- Усложняется тестирование кода
- Повторное использование кода невозможно
Иногда сходные антипаттерны возникают и в серверном коде, например в ASP.NET Web Forms[5].
Плохой пример (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).[4]
Примечания
- ↑ AntiPattern (by Indranil Nandy, IIT Kharagpur)
- ↑ Anders Toxboe. User Interface Anti-Patterns . UI Patterns (5 февраля 2009).
- ↑ 1 2 George Stepanek, Software Programming Secrets: Why Projects Fail page 14.
- ↑ 1 2 What not to do: Anti-Patterns and the Solutions, Apr 26, 2011
- ↑ Enterprise Integration Anti-Patterns #2 – Shared Assemblies (недоступная ссылка)
Литература
- Bruce A. Tate, Bitter Java. ISBN 193011043X, 2002. "An early antipattern: The Magic Pushbutton" page 54