Магическая кнопка: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
м Форматирование дат согласно Википедия:Техническое соглашение о датах и времени и Википедия:Обсуждение правил/Википедия:Техническое соглашение о датах и времени |
Спасено источников — 4, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8.8 |
||
Строка 1: | Строка 1: | ||
'''Магическая кнопка''' ({{lang-en|magic pushbutton}}) — [[антипаттерн]], появляющийся при недостатке абстракции, когда множество различных действий сваливается в кучу в неподходящем месте, например в обработчике нажатия на кнопку, вместо того чтобы быть распределёнными по подходящим классам и функциям. Обычно проблема возникает в [[Среда визуальной разработки|средах визуальной разработки]]<ref> |
'''Магическая кнопка''' ({{lang-en|magic pushbutton}}) — [[антипаттерн]], появляющийся при недостатке абстракции, когда множество различных действий сваливается в кучу в неподходящем месте, например в обработчике нажатия на кнопку, вместо того чтобы быть распределёнными по подходящим классам и функциям. Обычно проблема возникает в [[Среда визуальной разработки|средах визуальной разработки]]<ref>{{Cite web |url=https://www.scribd.com/doc/99553/AntiPattern-by-Indranil-Nandy-IIT-Kharagpur |title=AntiPattern (by Indranil Nandy, IIT Kharagpur)<!-- Заголовок добавлен ботом --> |access-date=2017-10-02 |archive-date=2016-03-05 |archive-url=https://web.archive.org/web/20160305164441/https://www.scribd.com/doc/99553/AntiPattern-by-Indranil-Nandy-IIT-Kharagpur |deadlink=no }}</ref><ref>{{Cite web |
||
|title=User Interface Anti-Patterns |
|title=User Interface Anti-Patterns |
||
|url=http://ui-patterns.com/blog/User-Interface-AntiPatterns |
|url=http://ui-patterns.com/blog/User-Interface-AntiPatterns |
||
Строка 5: | Строка 5: | ||
|date=2009-02-05 |
|date=2009-02-05 |
||
|publisher=UI Patterns |
|publisher=UI Patterns |
||
|access-date=2013-09-11 |
|||
⚫ | }}</ref>, когда программист сначала рисует [[пользовательский интерфейс]], а затем пишет [[Бизнес-логика|бизнес-логику]] в автоматически созданных [[Метод (языки программирования)|методах]], обычно — в методе обработки нажатия на кнопку, например «OK»<ref name="mgbtnpa14">George Stepanek, [https://books.google.ru/books?hl=en&lr=&id=8oBpeNUtiqoC Software Programming Secrets: Why Projects Fail] page 14.</ref>. |
||
|archive-date=2013-08-18 |
|||
|archive-url=https://web.archive.org/web/20130818181510/http://ui-patterns.com/blog/User-Interface-AntiPatterns |
|||
|deadlink=no |
|||
⚫ | }}</ref>, когда программист сначала рисует [[пользовательский интерфейс]], а затем пишет [[Бизнес-логика|бизнес-логику]] в автоматически созданных [[Метод (языки программирования)|методах]], обычно — в методе обработки нажатия на кнопку, например «OK»<ref name="mgbtnpa14">George Stepanek, [https://books.google.ru/books?hl=en&lr=&id=8oBpeNUtiqoC Software Programming Secrets: Why Projects Fail] {{Wayback|url=https://books.google.ru/books?hl=en&lr=&id=8oBpeNUtiqoC |date=20160312084123 }} page 14.</ref>. |
||
Проблемы этого антипаттерна: |
Проблемы этого антипаттерна: |
||
* Код обработчиков элементов интерфейса неконтролируемо растёт<ref name="mgbtnpa14"/> |
* Код обработчиков элементов интерфейса неконтролируемо растёт<ref name="mgbtnpa14"/> |
||
* Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным, например удаление кнопки может повлечь за собой удаление связанных с ней методов<ref name="nocsharp">[http://www.codeproject.com/Articles/187230/What-not-to-do-Anti-Patterns-and-the-Solutions What not to do: Anti-Patterns and the Solutions], Apr 26, 2011 |
* Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным, например удаление кнопки может повлечь за собой удаление связанных с ней методов<ref name="nocsharp">[http://www.codeproject.com/Articles/187230/What-not-to-do-Anti-Patterns-and-the-Solutions What not to do: Anti-Patterns and the Solutions] {{Wayback|url=http://www.codeproject.com/Articles/187230/What-not-to-do-Anti-Patterns-and-the-Solutions |date=20130906025024 }}, Apr 26, 2011</reF> |
||
* Усложняется тестирование кода |
* Усложняется тестирование кода |
||
* Повторное использование кода невозможно |
* Повторное использование кода невозможно |
Версия от 06:30, 12 июля 2022
Магическая кнопка (англ. 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) . Дата обращения: 2 октября 2017. Архивировано 5 марта 2016 года.
- ↑ Anders Toxboe. User Interface Anti-Patterns . UI Patterns (5 февраля 2009). Дата обращения: 11 сентября 2013. Архивировано 18 августа 2013 года.
- ↑ 1 2 George Stepanek, Software Programming Secrets: Why Projects Fail Архивная копия от 12 марта 2016 на Wayback Machine page 14.
- ↑ 1 2 What not to do: Anti-Patterns and the Solutions Архивная копия от 6 сентября 2013 на Wayback Machine, 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