Магическая кнопка: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Хороший пример (Borland Delphi): язык C# (ECMA Standard 334 и другие...) тут не причём. всё проблемы -- сугубо у MsVisualStudio
 
(не показано 25 промежуточных версий 19 участников)
Строка 1: Строка 1:
'''Магическая кнопка''' ({{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)|lang=en|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
{{Значимость|2010-06-28}}
|url=http://ui-patterns.com/blog/User-Interface-AntiPatterns
'''Магическая кнопка''' — это [[анти-паттерн]], очень распространённый в [[среда визуальной разработки|средах визуальной разработки]]. В этом случае, программист сначала рисует [[пользовательский интерфейс]], а затем пишет [[бизнес-логика|бизнес-логику]] в автоматически созданных [[метод (языки программирования)|методах]].
|lang=en
|author=Anders Toxboe
|date=2009-02-05
|publisher=UI Patterns
|access-date=2013-09-11
|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">{{cite web|author=George Stepanek|url=https://books.google.ru/books?hl=en&lr=&id=8oBpeNUtiqoC|title=Software Programming Secrets: Why Projects Fail|lang=en|page=14|archive-url=https://web.archive.org/web/20160312084123/https://books.google.ru/books?hl=en&lr=&id=8oBpeNUtiqoC|archive-date=2016-03-12}}</ref>.


Проблемы этого анти-паттерна:
Проблемы этого антипаттерна:
* Код обработчиков элементов интерфейса неконтролируемо растёт<ref name="mgbtnpa14"/>

* Изменение пользовательского интерфейса (или добавление нового интерфейса) становится сложным, например удаление кнопки может повлечь за собой удаление связанных с ней методов<ref name="nocsharp">{{cite web|url=http://www.codeproject.com/Articles/187230/What-not-to-do-Anti-Patterns-and-the-Solutions|title=What not to do: Anti-Patterns and the Solutions|lang=en|date=2011-04-26|archive-url=https://web.archive.org/web/20130906025024/http://www.codeproject.com/Articles/187230/What-not-to-do-Anti-Patterns-and-the-Solutions|archive-date=2013-09-06}}</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-08|bot=InternetArchiveBot }}</ref>.


== Плохой пример (Borland Delphi) ==
== Плохой пример (Borland Delphi) ==
Строка 60: Строка 71:
</source>
</source>


Сейчас эта проблема стала актуальной и в [[Visual C Sharp .NET|Visual C#]] ([[Microsoft Visual Studio]]).
Сейчас эта проблема стала актуальной и в [[Visual C Sharp .NET|Visual C#]] ([[Microsoft Visual Studio]])<ref name="nocsharp"/>.


== Ссылки ==
== Примечания ==
{{примечания}}

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


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

[[en:Magic pushbutton]]
[[es:Magic pushbutton]]

Текущая версия от 16:54, 25 июля 2024

Магическая кнопка (англ. 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].

Примечания

[править | править код]
  1. AntiPattern (by Indranil Nandy, IIT Kharagpur) (англ.). Дата обращения: 2 октября 2017. Архивировано 5 марта 2016 года.
  2. Anders Toxboe. User Interface Anti-Patterns (англ.). UI Patterns (5 февраля 2009). Дата обращения: 11 сентября 2013. Архивировано 18 августа 2013 года.
  3. 1 2 George Stepanek. Software Programming Secrets: Why Projects Fail (англ.) 14. Архивировано 12 марта 2016 года.
  4. 1 2 What not to do: Anti-Patterns and the Solutions (англ.) (26 апреля 2011). Архивировано 6 сентября 2013 года.
  5. Enterprise Integration Anti-Patterns #2 — Shared Assemblies (недоступная ссылка)

Литература

[править | править код]
  • Bruce A. Tate, Bitter Java. ISBN 193011043X, 2002. «An early antipattern: The Magic Pushbutton» page 54