代码之家  ›  专栏  ›  技术社区  ›  Andrei Rînea

显式或隐式执行控制语句的使用

  •  0
  • Andrei Rînea  · 技术社区  · 15 年前

    我有时用

    if (this._currentToolForeColor.HasValue)
        return this._currentToolForeColor.Value;
    else
        throw new InvalidOperationException();
    

    其他时候我用

    if (this._currentToolForeColor.HasValue)
        return this._currentToolForeColor.Value;
    throw new InvalidOperationException();
    

    我知道这两者是等价的,但我不确定哪一个是最好的,为什么。

    这更进一步,因为您可以使用其他执行控制语句,如brake或continue:

    while(something)
    {
        if(condition)
        {
            DoThis();
            continue;
        }
        else
            break;
    }
    

    while(something)
    {
        if(condition)
        {
            DoThis();
            continue;
        }
        break;
    }
    

    编辑1:是的,循环示例很糟糕,因为它们是合成的(即:弥补了这个问题),不像第一个是实用的。

    7 回复  |  直到 14 年前
        1
  •  5
  •   Neil Barnwell    15 年前

    早早失败。

    public void SomeFunction(object someParameter)
    {
        if (someParameter == null) throw new ArgumentNullException("someParameter", "Value cannot be null");
    
        // Use the parameter here for stuff
        SomeOtherFunction(someParameter, Whichway.Up);
    }
    

    同样的道理也适用于美国 return 陈述如果你的方法完成了,不要把东西用大包装 if 回来

    看见 reducing cyclomatic complexity 如果 大括号和大括号(即使不使用大括号,如示例中所示)对可读性的影响都大于示例之间的差异。

        2
  •  3
  •   HTTP 410    15 年前

    第一个和第二个选项相当于编译器。但是对于阅读代码的人来说,第一个选项肯定更清楚其意图,也更容易阅读。

    人类读者从数千行文字中吸收的东西是有限的,这些文字主要是为了功能,而不是为了传达意义。每一个小小的努力都会使任务变得容易,这是好事。

        3
  •  3
  •   codymanix    15 年前
    while(something) {
        if(condition)
        {
            DoThis();
            continue;
        }
        else
            break; }
    

    while(something && condition)
    {
         DoThis();
    }
    

    对于您的问题:最好更明确地说明控件如何流动,即使它看起来是冗余的(例如,多余的,否则连接会被优化掉)。所以如果(cond)返回x,否则抛出y是好的。

    但是如果对方法参数进行错误检查,则应该执行以下操作 全部的 在方法开始时进行检查,因此不需要任何其他方法。

        4
  •  1
  •   Brian Rasmussen    15 年前

        5
  •  1
  •   Adriaan Stander    15 年前

    我认为在这种情况下,可读性是主要关注点。

    如果您发现自己使用相同的方法上下滚动,或者无法跟踪执行流,则可能需要重写它。上述中断向我表明,while条件不足以检查。

    它有它的用途,但是要小心,你不希望团队中的另一个开发人员说

    这里有龙!!!

        6
  •  1
  •   Frederik Gheysels    15 年前

    Resharper将建议您使用以下选项:

    if( someCondition )
       return foo;
    
    throw new InvalidArgumentException();
    

    就个人而言,我觉得下面的解决方案更明确,因此我更喜欢它。但这只是个人的选择。

    if( someConditiion )
    {
       return foo;
    }
    else
    {
       throw new ....
    }
    

    为什么不这样写呢:

    while( something )
    {
        if( !condition ) 
            break;
    
        DoStuff();
    }
    
        7
  •  1
  •   ccalboni    15 年前

    if(condition)
    {
       //do stuff
    }
    else
    {
       //do stuff
    }
    

    等等

    这只是一个“品味”的问题,但即使您有更多的代码行,这也是清晰可读的,因为您不必解释或理解,您可以用手指轻松地跟随代码流。所以,对我来说,始终是else,即使返回阻止返回到下面的代码中,如果有一行if/else,则始终将事件括起来,以此类推。

    Framework Design Guidelines