以下哪个代码块更符合逻辑?

时间:2011-09-27 20:43:37

标签: c#

想象一下,对于一个方法来说,应该是真的。哪个区块代表最佳方法(性能相关和可读性),或者如果不是,您的建议是什么?!

private void method()
{
    if(!condition)
    {
     MessageBox.Show("ERROR!");
     return;
    }     
    else
    {
        //DO STUFF
    }
}

OR

private void method()
{
    if(condition)
    {
         //DO STUFF
    }     
    else
    {
         MessageBox.Show("ERROR!");
         return;
    }
}

9 个答案:

答案 0 :(得分:13)

都不是。改为使用保护条款:

private void method()
{
    if(!condition)
    {
        MessageBox.Show("ERROR!");
        return;
    }     

    //inputs have been checked, proceed with normal execution
}

通过这种方式,您可以预先处理所有异常行为,并避免正常执行路径的过度缩进。

答案 1 :(得分:3)

嗯,两者都没有,因为你不会同时使用elsereturn

所以,你要么:

private void method() {
  if (!condition) {
    MessageBox.Show("ERROR!");
  } else {
    //DO STUFF
  }
}

或:

private void method() {
  if (condition) {
    //DO STUFF
  } else {
    MessageBox.Show("ERROR!");
  }
}

或:

private void method() {
  if (!condition) {
    MessageBox.Show("ERROR!");
    return
  }
  //DO STUFF
}

或:

private void method() {
  if (condition) {
    //DO STUFF
    return;
  }
  MessageBox.Show("ERROR!");
}

您使用的主要取决于代码实际执行的操作。代码很少像示例中那样简单,因此代码将会更加重要。

前两个具有单个退出点的优势,这通常使得更容易遵循代码。您通常会先将较短的代码放在首位,因为在较大的代码块之后,它比在else中更容易发现。

第三个通常用于在继续使用主代码之前验证输入,并且您可以轻松地进行多个验证:

private void method() {
  if (!condition) {
    MessageBox.Show("ERROR!");
    return
  }
  if (!anotherCondition) {
    MessageBox.Show("ANOTHER ERROR!");
    return
  }
  //DO STUFF
}

如果你有几个条件不想放在同一个if语句中,那么第四个是有用的:

private void method() {
  if (condition) {
    var data = GetSomeData();
    if (data.IsValid) {
      var moreData = GetSomeMoreData();
      if (moreData.IsValid) {
        //DO STUFF
        return;
      }
    }
  }
  MessageBox.Show("ERROR!");
}

答案 2 :(得分:1)

二!第二!

但是我确实承认如果“// DO STUFF”真的很长并且是嵌套的,那么有时会做第一次。

答案 3 :(得分:0)

我更喜欢“如果条件”的方法,而不是对条件的否定,但这只是个人偏好。

答案 4 :(得分:0)

这取决于。

在大多数情况下,第二个版本。

如果(!condition)块中的代码量只有几行代码,并且(条件)块中的代码是很多代码,那么我会反过来回答。如果您可以在不必滚动的情况下看到“其他”,则更容易阅读if语句。

答案 5 :(得分:0)

我更喜欢大卫提到的保护条款,但在一般情况下,你应该把最常见的案例放在第一位。它使得更容易遵循方法的流程。

答案 6 :(得分:0)

这更像是一个风格问题,而不是一个“逻辑”问题。这两种方法都有效,您将使用哪种方法通常取决于您作为思想家/开发者的风格。

也就是说,一旦你开始使用这些风格中的任何一种,通常都要保持一致。拥有大型课程,其中某些功能以第一种方式执行,而其他功能则采用第二种方式,这可能导致以后的可维护性问题。

罗伯特·马丁的Clean Code提出了一个有趣的章节,建议无论你选择哪种方式,// DO STUFF部分应该另一个函数调用

功能应该只做一件事

答案 7 :(得分:0)

可读性/标准明智。我会接受2号。我认为表现并不明显,但我不是一个低级别的人。

答案 8 :(得分:0)

通常这是一个问题,要求得到以下答案:“这取决于”,我将通过两个例子来说明。
如果不是条件 对于ASP .Net Web Forms验证,我经常看到这段代码

protected void btSubmit_OnClick(object sender, EventArgs e)
{
  Page.Valide();
  if (!Page.IsValid)
     return;
  var customer = new Customer();
  // init 20 properties of customer
 ....
  var bo = new CustomerBO();
  bo.Save(customer);
}

还有一个更受欢迎:

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                    {
                    }
        }

IF CONDITION

public void UpdateCustomer(int customerId, string ...../*it might be a customer type also*/)
{
   using (var ctx= CreateContext())
 {
    var customer = ctx.Customers.FirstOrDefault(c=>c.CustomerId = customerId);
    if ( customer != null)
    {
           /*code update 20 properties */
    }
 }
}

我希望代码清楚:P