procedure MyProc(Eval: Boolean);
begin
if not Eval then
Exit;
/* do stuff */
/* do more stuff */
end;
OR
procedure MyProc(Eval: Boolean);
begin
if Eval then
begin
/* do stuff */
/* do more stuff */
end;
/* no Exit needed, but now we got what I think unpleasing code:
having a indentation level and a begin-end statement */
end;
答案 0 :(得分:16)
有些方法都适用。然而,通常,第一个提供更可读的代码和更好的控制流。我对Delphi编程不太熟悉,但在C#中我总是尽可能使用前者。从表面上看,我认为这种方法在Delphi中没有任何不同。
列出一些优点:
但是,有些情况下第二种选择更合适。特别是,当需要将方法分解为子部分时(尽管这通常表明您需要重构)。
答案 1 :(得分:10)
我认为这是一个偏好问题。但是,如果您在执行“实际工作”之前必须执行许多检查,那么第一个表单(IMO)看起来更整洁,并且更容易遵循流程。例如:
procedure MyProc(Eval: Boolean);
begin
if not Eval then
Exit;
if not Eval2 then
Exit;
/* do stuff */
/* do more stuff */
end;
v.s。
procedure MyProc(Eval: Boolean);
begin
if Eval then
begin
if Eval2 then
begin
/* do stuff */
/* do more stuff */
end;
end;
end;
答案 2 :(得分:4)
有些人会说你的功能只有一个退出点,但我不在那个阵营。
我经常使用多次返回,并且它不会影响精心设计的短功能的可读性,所以我想说只要你认为更可读的任何东西。
我有人重构我编写的代码遵循“规则”,并且几乎总是因为过多的缩进而导致无法读取的代码。他们应该把它留下来或者做得恰到好处,把它分解成更多的功能。
我看到的一个特别烦恼是"else"
中的喜欢:
if (some condition)
return false;
else
keep going;
他们是否认为控制流程会以某种方式逃脱"then"
条款?
答案 3 :(得分:3)
我经常使用第一张表格。这是对前置条件的一些文字编程,特别是因为在第二个例子中的实际检查之间插入代码时,确切的条件不太清楚。
我确实试图将EXIT使用限制在程序的第一个条件检查部分,但为了避免过多的意大利面条,但我认为第一种形式比箍更干净,以保持那个出口点。
考虑到在D2009中添加了退出(returnvalue)(以及FPC已经使用了十年)这一事实似乎被大量使用了
答案 4 :(得分:3)
我更喜欢:
if not Eval then Exit;
因为代码看起来更干净。
答案 5 :(得分:2)
我认为代码段的退出点越少越好,因此更容易阅读和理解。注意比调试其他人的100行函数更糟糕,并且发现其中有12种不同的情况可能导致它早期返回。
答案 6 :(得分:1)
我是否可以请求如果您使用第二种形式,则不会添加无偿的缩进级别。所以insrtead:
procedure MyProc(Eval: Boolean);
begin
if Eval then
begin
/* do stuff */
/* do more stuff */
end;
/* no Exit needed, but now we got what I think unpleasing code:
having a indentation level and a begin-end statement */
end;
说:
procedure MyProc(Eval: Boolean);
begin
if Eval then
begin
/* do stuff */
/* do more stuff */
end;
/* no Exit needed, but now we got what I think unpleasing code:
having a indentation level and a begin-end statement */
end;
答案 7 :(得分:0)
现实情况是,这是一个过于简单的例子来搪塞。您将根据现有惯例选择您的方法 - 这个例子对于约定做出决定太简单了。更有趣的是如何处理多个get-out-now选项和嵌套的IF语句 - 这是一个真正的灰色区域。
那么我的惯例是什么?啊......我务实,我没有任何规则。如果可以在前几行中跳出窗口,我会接受它,因为无论何时编辑代码,我都不必记住某些“无回复函数调用”在函数期间的任何时候都可以存在。< / p>
随着时间的推移,这个功能将被错误和增强功能模塑和捏合。你比后者更有可能用后一种方法引入一个新的bug,因为快速退出在开始时是明显的,在你的脸上,你不需要担心它“被遗忘”50行下来的功能。当然,在我的错误介绍体验中。
这是一个更棘手的召唤,如果你设置并且不得不将它们拆掉,因为跳出可能会迫使你在做出改变时将17个薛定谔猫的状态放在脑中。
答案 8 :(得分:0)
在我看来,答案都不正确。
正确的解决方案是在程序中仅包括“做东西”和“做更多东西”部分。然后,将过程调用包装在if语句中,只在必要时调用它。
正如你在评论中所说,“做东西”和“做更多东西”涵盖了两个不同的领域,那么也许你想要两个程序 - 一个是“做东西”而另一个是“做更多东西”。如果你经常一起执行这两个过程,你还可以包括一个简单地调用另外两个过程的第三个过程。