Delphi 5:模拟的想法;“过时”;或;不赞成;方法?

Delphi 5:模拟的想法;“过时”;或;不赞成;方法?,delphi,deprecated,Delphi,Deprecated,我想将一个方法标记为过时,但Delphi5没有这样的功能 举个例子,下面是一个虚构的方法,它的形式是不推荐的和新的首选形式: procedure TStormPeaksQuest.BlowHodirsHorn; overload; //obsolete procedure TStormPeaksQuest.BlowHodirsHorn(UseProtection: Boolean); overload; 注意:对于这个假设的例子,我们假设使用无参数版本是非常糟糕的。不“使用保护”也有一些问题,

我想将一个方法标记为过时,但Delphi5没有这样的功能

举个例子,下面是一个虚构的方法,它的形式是不推荐的和新的首选形式:

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;
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
var
   ThisMethodIsObsolete: Boolean;
begin
   ...
end;
我希望只有当有人引用代码时,这才会引起提示。但是Delphi显示了一个提示,即使您没有调用实际使用的过时方法


有人能想到别的吗?

为什么要这样做,为什么不升级Delphi版本

如果没有不推荐使用的标记,您实际上没有干净的选项来过滤不推荐使用的方法。因此,这取决于您想在哪里做出让步:

  • 重命名会在编译时捕获错误(除非作用域中有另一个同名的方法/函数)
  • 所有其他方法仅在运行时捕获。这有可能会滑入生产代码
您可以做的是创建一个不推荐使用的日志。这不会激怒任何人,而且如果它进入生产代码,也不是完全的灾难。但是如果你的测试覆盖了全部,你会抓住所有的罪犯。您只需在(测试)运行后检查日志文件


当然,最好的方法是使用grep查找所有出现的代码并进行更改。

为什么要这样做,为什么不升级Delphi版本

如果没有不推荐使用的标记,您实际上没有干净的选项来过滤不推荐使用的方法。因此,这取决于您想在哪里做出让步:

  • 重命名会在编译时捕获错误(除非作用域中有另一个同名的方法/函数)
  • 所有其他方法仅在运行时捕获。这有可能会滑入生产代码
您可以做的是创建一个不推荐使用的日志。这不会激怒任何人,而且如果它进入生产代码,也不是完全的灾难。但是如果你的测试覆盖了全部,你会抓住所有的罪犯。您只需在(测试)运行后检查日志文件


当然,最好的方法是使用grep查找所有出现的代码并对其进行更改。

这并不能完全回答您的问题,但它可能提供一种替代解决方案。无法使用默认值更新原始函数

procedure TStormPeaksQuest.BlowHaldirsHorn(UseProtection: Boolean = False);

…因此,旧代码的编译和行为相同,但新的功能可供新的开发人员使用。

这并不能完全回答您的问题,但可能会提供一种替代解决方案。无法使用默认值更新原始函数

procedure TStormPeaksQuest.BlowHaldirsHorn(UseProtection: Boolean = False);

…因此,旧代码的编译和行为相同,但新的功能可供新的开发人员使用。

如果可以,我同意一个可选参数。但我能想到的情况是可选参数不适合。例如,我将函数移到了新的单元中,但保留了旧的单元,并将它们标记为已弃用

我想无论你采用什么解决方案,都将取决于你的团队的纪律。他们是否积极注意并努力纠正应用程序的所有提示和警告?希望他们能做到,但我很惭愧地承认,与我一起工作的团队(包括我自己)没有掌握所有的提示和警告。在时间允许的情况下,我时不时地修正尽可能多的提示和警告,我们绝对应该修正警告,但事实上,我们必须完成工作,更加关注新功能和截止日期


因此,我的观点是,即使您可以将它们标记为已弃用或给出类似的提示/警告,您是否觉得您的团队无论如何都会花时间更改其代码?

如果可以,我同意一个可选参数。但我能想到的情况是可选参数不适合。例如,我将函数移到了新的单元中,但保留了旧的单元,并将它们标记为已弃用

我想无论你采用什么解决方案,都将取决于你的团队的纪律。他们是否积极注意并努力纠正应用程序的所有提示和警告?希望他们能做到,但我很惭愧地承认,与我一起工作的团队(包括我自己)没有掌握所有的提示和警告。时不时
{$DEFINE Strict}