我想标记一个过时的方法,但Delphi 5没有这样的功能。德尔福5:模拟“过时”或“弃用”方法的想法?
举一个例子的缘故,这里是一个虚构的方法与它的过时,新的最佳形式:
procedure TStormPeaksQuest.BlowHodirsHorn; overload; //obsolete
procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload;
注:对于这个假设的例子中,我们假设使用参数的版本只是很糟糕。有没有“使用保护”的问题 - 这没有很好的解决方案。没有人喜欢使用保护,但没有人想要而不是使用保护。因此,当blowing Hodir's horn时,我们让来电者决定是否要使用保护。如果我们默认的参数的版本使用的保护,继续不:
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也会显示提示。
任何人都可以想到别的吗?
嗯。有趣的是,所有提供示例代码的三个答案拼写错了_Hodir_,并且在做这件事时做出了完全相同的错误。 :P – 2011-04-18 22:39:48
我怪我最初的错字,这些人被复制到答案中。我不认为大多数人会得到参考无论如何:) – 2011-04-20 20:18:19
我想你还没有去过诺森德一段时间。 ^^ – 2011-04-20 22:32:56