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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 3: Строка 3:
|url=http://ui-patterns.com/blog/User-Interface-AntiPatterns
|url=http://ui-patterns.com/blog/User-Interface-AntiPatterns
|author=Anders Toxboe
|author=Anders Toxboe
|date=5 February 2009
|date=2009-02-05
|publisher=UI Patterns
|publisher=UI Patterns
}}</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>.
}}</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>.

Версия от 22:55, 24 декабря 2021

Магическая кнопка (англ. 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. Anders Toxboe. User Interface Anti-Patterns. UI Patterns (5 февраля 2009).
  3. 1 2 George Stepanek, Software Programming Secrets: Why Projects Fail page 14.
  4. 1 2 What not to do: Anti-Patterns and the Solutions, Apr 26, 2011
  5. Enterprise Integration Anti-Patterns #2 — Shared Assemblies (недоступная ссылка)

Литература

  • Bruce A. Tate, Bitter Java. ISBN 193011043X, 2002. «An early antipattern: The Magic Pushbutton» page 54