17-08-2003 20:08 Вернуть результат, или Trust no one
Вот код из исходников одного известного компонента. Даже идущего в поставке Delphi 5. Имена и фамилии изменены.
procedure TSomeComponent.PrinterSetup;
var
  aDialog : TSomePrintDialog;
[...]
begin
  aDialog := TSomePrintDialog.Create(Application);
  [...]
  with aDialog do
  try
    [...]
      if Execute then
      begin
        Self.Tag := 0;
      end
      else Self.Tag := 1;
  finally
    free;
  end
end;

Вот help на компонент:

Tag
Stores an iteger value as part of a component.

property Tag : Integer

Applies to

TSomeComponent

Description

Tag has no predefined meaning. It is provided for the convenience of storing additional integer value or poiner information for special needs in an application. For example, use the Tag property when implementing case statements with a component.


Один классик сказал: «Всё, что мне нравится, либо нелегально, либо аморально, либо ведёт к ожирению.» В программировании все проблемы сводятся либо к легальности, либо к моральности, либо к безопасности.

Вышеприведённый код легален. Он собирается и (если пользователь (прикладной программист) знает о данной особенности) работает. То есть, например, можно написать:
x.PrintSetup;
if 0 = x.Tag then
  x.Print;
С остальными пунктами хуже. Во-первых, возвращать результат через Tag, вместо того, чтобы сделать PrinterSetup функцией, возвращающей Boolean, аморально. Во-вторых, аморально не отражать это в документации. В-третьих, не отражать это в документации опасно. Программист, решивший использовать Tag этого компонента в личных целях (как ему разрешено документацией), обречён на долгую отладку и недоумение «б, кто, на, портит, б, мои Tag’и, на?»
Комментарии:
18-08-2003 15:57
Камрад с блокнотиком
Да… а для тех, кто в лицо не узнал — это мой нелюбимый QuickReport.
Закрыть