我想将方法标记为过时,但Delphi 5没有这样的功能.
为了举个例子,这里有一个虚构的方法,它已被弃用并且是新的首选形式:
procedure TStormPeaksQuest.BlowHodirsHorn; overload; //obsolete procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
注意:对于这个假设的例子,我们假设使用无参数版本是非常糟糕的.没有" 使用保护 " 存在问题- 没有好的解决方案.没有人喜欢不必使用保护,但没有人愿意不采取保护措施.所以我们让呼叫者在吹Hodir号角时决定是否要使用保护.如果我们默认无参数版本继续不使用保护:
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;
但这会导致编译错误,人们会嘲笑我(我真的不想听到他们的抱怨).我希望他们得到一个唠叨,而不是一个实际的错误.
我想添加一个断言:
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也会显示提示.
谁能想到别的什么?
怎么样的
procedure TStormPeaksQuest.BlowHaldirsHorn; //obsolete begin if DebugHook > 0 then asm int 3 end; // This method is Obsolete! Use XXXXX instead. Abort; // Optional, makes method useless // old code here . . . end;
断言和showmessage之间的妥协.开发人员只需要按F9继续.你可以放入一个Abort,然后该方法什么都不做,这将迫使他们切换方法,而break会让他们意识到它.
我个人建议升级到更新版本的Delphi.2007年和2009年是很棒的版本,非常值得升级.