什么是更好的选择?

时间:2009-06-20 12:07:04

标签: delphi coding-style

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;

9 个答案:

答案 0 :(得分:16)

有些方法都适用。然而,通常,第一个提供更可读的代码和更好的控制流。我对Delphi编程不太熟悉,但在C#中我总是尽可能使用前者。从表面上看,我认为这种方法在Delphi中没有任何不同。

列出一些优点:

  • 无需缩进后续代码。
  • 更容易扩展到多种条件。 (只需添加额外的if语句而不是逻辑运算符,这样可以使IMO更清晰。)
  • 你“选择退出”该方法而不是选择加入的想法更美观,因为以下代码应该在“正常”情况下执行。

但是,有些情况下第二种选择更合适。特别是,当需要将方法分解为子部分时(尽管这通常表明您需要重构)。

答案 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语句中,只在必要时调用它。

正如你在评论中所说,“做东西”和“做更多东西”涵盖了两个不同的领域,那么也许你想要两个程序 - 一个是“做东西”而另一个是“做更多东西”。如果你经常一起执行这两个过程,你还可以包括一个简单地调用另外两个过程的第三个过程。

相关问题