我对正确的做事方式存在内部争议。也许你可以帮忙:)。
假设我有函数
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()少于十行。你更喜欢哪种款式?为什么?我倾向于第一个例子,但我想知道其他人的想法。
答案 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)未执行时。