Delphi的退出声明是否危险?

Fed*_*can 16 delphi

阅读Delphi的Exit声明(例如参见这里),我不能忽视写作的每个作者都觉得有责任给出一条建议,例如:

警告:谨慎使用 - 跳转是一种与结构化编码不一致的概念 - 它使代码维护变得困难.

现在,我来自Unix中的C和C++,我熟悉重入问题,但老实说,我无法弄清楚为什么Delphi在它到达自然结束之前从函数返回应该是邪恶的.

除非Delphi中的每个功能和程序都被认为是可重入的.

我错过了什么?

Dav*_*nan 12

有两种思想流派.

一种思想流派认为功能应该有一个退出点.许多编码标准通常都会强制执行.这样做的动机来自于使用gotos,多个出口等维护充满大功能的意大利面条代码的艰难经历.

另一种思想认为意大利面条代码很糟糕,但应该务实并根据其优点判断编码风格,而不是遵循教条规则.例如,许多程序员认为守护子句比你不使用时产生的深度缩进函数要好得多exit.作为一个例子,请考虑Martin Fowler出色的重构目录中的以下示例:将Nested Conditional替换为Guard子句.

从根本上说,这一切都归结为个人偏好.我个人鼓励使用保护条款,但不要在长程序中大量使用退出.

  • +1.即使我认为你说明显了,你也说得很好! (3认同)

Mas*_*ler 9

你错过了它没有说"不要使用这个"或"退出是邪恶的"; 它说"仔细使用它." 它说它可以使维护变得困难.例如,如果你有一个很大的方法,并且中间有一条这样的线,你可能会完全错过它:

if aLocalObject.CheckSomeValue(aParameter) <> RIGHT_VALUE then Exit;
Run Code Online (Sandbox Code Playgroud)

是的,不幸的是,我之前见过这样的东西.:(

通过一些经验法则可以减轻许多问题:

  • 始终把Exit(和BreakContinue)声明自己的线上.这让他们更难错过.
  • 支持小方法而不是大方法,并在合理的情况下将大方法分解为较小方法.(当合理的时候!这不是一个绝对的规则,过于热心地应用它会使事情变得更糟而不是更好.请记住爱因斯坦的引述:"尽可能简化所有事情,但不要简单.")
  • 学习使用try/finally块,以便Exit在不引起泄漏或损坏的情况下安全地执行过程.

  • @Andreas:Gah!我的眼睛! (2认同)