Я хочу пометить метод как устаревший, но в Delphi 5 такой функции нет.
В качестве примера, вот метод выдумки с его устаревшей и новой предпочтительной формой:
procedure TStormPeaksQuest.BlowHodirsHorn; overload; //obsolete
procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
Примечание: Для этого гипотетического примера мы предполагаем, что использование версии без параметров просто плохо. Есть проблемы с " использованием защиты ", которые не имеют хорошего решения. Никто не любит использовать защиту, но никто не хочет не использовать защиту. Поэтому мы заставляем звонящих решать, хотят ли они использовать защиту или нет, когда дует в рог Ходира . Если по умолчанию версия без параметров продолжится , а не с использованием защиты:
procedure TStormPeaksQuest.BlowHodirsHorn;
begin
BlowHodirsHorn(False); //No protection. Bad!
end;
тогда разработчик рискует всякими неприятностями. Если мы заставим версию без параметров использовать защиту:
procedure TStormPeaksQuest.BlowHodirsHorn;
begin
BlowHodirsHorn(True); //Use protection; crash if there isn't any
end;
тогда есть вероятность проблем, если разработчик не получил никакой защиты или не владеет ею.
Теперь я могу переименовать устаревший метод:
procedure TStormPeaksQuest.BlowHodirsHorn_Deprecatedd; overload; //obsolete
procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
Но это приведет к ошибке компиляции, и люди будут ссориться со мной (и я действительно не хочу слышать их нытье). я хочу, чтобы они получили nag , а не реальную ошибку.
Я думал о добавлении утверждения:
procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
begin
Assert(false, 'TStormPeaksQuest.BlowHodirsHorn is deprecated. Use BlowHodirsHorn(Boolean)');
...
end;
Но я не могу гарантировать, что разработчик не отправит версию без утверждений, что вызовет неприятный сбой для клиента .
я думал об использовании только выдачи утверждения, если разработчик отлаживает:
procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
begin
if DebugHook > 0 then
Assert(false, 'TStormPeaksQuest.BlowHodirsHorn is deprecated. Use BlowHodirsHorn(Boolean)');
...
end;
Но я действительно не хочу вызывать сбои вообще.
Я думал показать MessageDlg, если они находятся в отладчике (это техника, которую я делал в прошлом):
procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
begin
if DebugHook > 0 then
MessageDlg('TStormPeaksQuest.BlowHodirsHorn is deprecated. Use BlowHodirsHorn(Boolean)', mtWarning, [mbOk], 0);
...
end;
но это все еще слишком разрушительно. И это вызвало проблемы, когда код застревал при отображении модального диалога, но диалоговое окно явно не было видно.
Я надеялся получить какое-то предупреждающее сообщение, которое будет их мучить - пока они не выбьют себе глаза и, наконец, не изменят свой код.
Возможно, я подумаю, если добавлю неиспользуемую переменную:
procedure TStormPeaksQuest.BlowHodirsHorn; //obsolete
var
ThisMethodIsObsolete: Boolean;
begin
...
end;
Я надеялся, что это вызовет подсказку, только если кто-то ссылается на код. Но Delphi показывает подсказку, даже если вы не вызываете, на самом деле используйте устаревший метод.
Кто-нибудь может думать о чем-то еще?