编码风格:如果每个分支返回使用if / elif / else?

时间:2010-07-27 14:04:22

标签: coding-style

您更喜欢哪种编码风格?为什么?

if case1:
    return res1
if case2:
    return res2
return res3

或:

if case1:
    return res1
elif case2:
    return res2
else:
    return res3

或:

res = None
if case1:
    res = res1
elif case2:
    res = res2
else:
    res = res3
return res

原因:我的代码看起来像这样,我想知道表达它的最清晰的方式是什么。我个人无法在第1和第2之间做出决定,我不会考虑第3个。

我准备标记这种语言不可知,但我意识到函数式语言没有这个问题,因为它默认为case 2 = P.

7 个答案:

答案 0 :(得分:2)

如果每个都是整个功能,那么它可能无关紧要。对于更复杂的函数,我更喜欢第三种,因为几个月后阅读代码时很容易错过函数中间的返回。

在类似的说明中,我会避​​免第一个,因为如果有人后来决定他们想要转移到某些后期处理的第三个答案之类的东西,他们可能会错过条件并非相互排斥。这可以带来愉快的调试时间。

答案 1 :(得分:1)

如果您有可用的switch(或case)语句,并且案例正在评估相同的变量,请使用:

在C#中

Switch(Condition)
{
  case 1:
    return res1;
  case 2:
    return res2;
  default:
    return res3;    }

或者,如果您先设置变量,请将这些return语句更改为变量分配,并且不要忘记添加break;

如果您的案例没有评估相同的变量,那么我更喜欢2(可读性)

if(variable1 = x) return result1;
else if(variable2 = y) return result2;
else return result3;

答案 2 :(得分:0)

第一个和第二个并不等同。

第一个并不意味着条件是相互排斥的。

如果是,请使用2或3。

我更喜欢选项3 ,因为如果你想要执行一些预返回功能或常见的后处理,那么你和其他人一样有麻烦。

相反,您可以使用第3个选项而不使用else:

res = res3   // Default
if case1:
   res=res1
elif case2:
   res=res2
postprocessing
return res

修改

是的,你是对的,它与回报是互斥的。但我想我不喜欢它,因为if结构本身并不能捕获它。

答案 3 :(得分:0)

通常我会选择第二种风格。它以非常清晰的方式向IMO传达您对另一位程序员的意图。但是我同意Sanjay的说法,第3个选项对于任何后期处理都很好(几乎是必需的)(认为这似乎不是你的意图)。

答案 4 :(得分:0)

我经常使用案例#1。我编写的一大块例程必须验证用户输入。我进入日常工作的越多,我知道的事情就越正确,我需要跟踪的项目/条件越少。如果我可以确定输入因任何原因无效,我会保释。

人们的习惯和风格各不相同,但我在问题中列出的例子中看到'else if'中的'else'是多余的。如果存在,我希望有某种形式的后处理,然后必须跟踪前面的if语句的状态/变量。否则我更愿意在实际使用if-then-bail。

答案 5 :(得分:0)

我个人更喜欢第一个。但我想我是偏见的,因为我的代码行数较少。

就可读性而言,我不得不说案例2是最明确的选择。我不喜欢案例3,因为它在没有必要时引入了一个新变量,因此似乎是多余的。

答案 6 :(得分:0)

如果返回代码在所有情况下均匀变化(例如切换单位或类似的东西),第三个显然会更容易更改函数。除此之外,恕我直言,第一号套房最琐碎的功能 - 它干净,小巧,绝对明显。而第三版可能具有的额外未来重构优势是每个优秀的编辑都能轻松弥补的。

我会说:选择任何人并继续前进

PS:它甚至不会触发某种编译器魔法,至少不会在C和我的机器上(gcc 4.4.3,Linux)。所有3种变体都编译为完全相同的代码。