在风格和清洁方面,哪些功能最合适?

时间:2010-08-14 03:35:11

标签: coding-style

我对正确的做事方式存在内部争议。也许你可以帮忙:)。

假设我有函数

foo(x, y) 
{  
  if (x satisfies condition c1)
    if (y satisfies condition c2)
      bar(x)
  else
    bar(x)

  ...
}

bar(x)
{
  ...
}

另一种选择是

foo(x, y) 
{ 
  doBarFlag = false
  if (x satisfies condition c1)
    if (y satisfies condition c2)
      doBarFlag = true
  else
    doBarFlag = true

  if (doBarFlag)
  {
    ...code from bar() goes in here
  }

  ...
}

另一种选择(上述略有变化)

foo(x, y) 
{ 
  doBarFlag = true
  if (x satisfies condition c1)
    if (y DOES NOT satisfy condition c2)
      doBarFlag = false

  if (doBarFlag)
  {
    ...code from bar() goes in here
  }

  ...
}

假设bar()少于十行。你更喜欢哪种款式?为什么?我倾向于第一个例子,但我想知道其他人的想法。

4 个答案:

答案 0 :(得分:4)

怎么样

foo( x, y ) {
  if ( ! c1(x) || c2(y) )
    bar(x)
}

这个逻辑转换有一个名字,我忘了......

答案 1 :(得分:1)

其他答案对如何改进代码有很好的建议,我只是有一个样式建议。无论长度如何,我都会在所有代码块上使用大括号:

// C# style
foo(x, y) 
{ 
    if (condition) 
    {
        // do something
    }
    else 
    {
        // do something else
    }
}

// What I normally use
foo(x, y) { 
    if (condition) {
        // do something
    } else {
        // do something else
    }
}

这样,如果你想稍后添加另一个语句,它将不会被添加到错误的位置。 但是不要在造型上过于虔诚,只要与你使用的任何东西保持一致。

答案 2 :(得分:0)

首先,定义函数的原因之一是能够使用短名称引用(而不是必须重复)一堆代码。因此,重复使用该短名称不一定是坏事。因此,您的选项#1非常合理,而且冗余最少。

其次,如果foo()中真的发生了这种情况,为什么不这样做呢?

foo(x, y) 
{  
  if (x satisfies condition c1) && !(y satisfies condition c2)
    return

  bar(x)
}

甚至只是

foo(x, y) 
{  
  if !(x satisfies condition c1) || (y satisfies condition c2)
    bar(x) 
}

在大多数语言中,&&和||运营商(或其等​​价物)短路,因此如果他们可以从左侧确定他们的真值,则不会尝试评估他们的右侧。因此,您通常不需要担心诸如“如果x为真,则只存在y的属性”之类的事情。

答案 3 :(得分:0)

怎么样

foo(x,y)
{
    if(x satisfies c1 && y does not satisfy c2)
        return;
    bar(x);
}

通过这种方式,您可以轻松地看到bar(x)未执行时。