代码可读性与简洁性

时间:2010-02-16 17:36:02

标签: c coding-style

以下两个代码段的优点和缺点是什么:

return n==0 ? 0 : n==1 ? 1 : fib(n-1) + fib(n-2);

 if(n==0)  
    return 0;
 if(n==1)
    return 1;
 return fib(n-1) + fib(n-2);

用于计算Fibonacci序列中的第n个字母?

你会赞成哪一个?为什么?

14 个答案:

答案 0 :(得分:7)

第一个是魔鬼,必须用火清洗。

答案 1 :(得分:6)

我赞成:

return n <= 1 ? n : fib(n-1)+fib(n-2);

答案 2 :(得分:4)

我更喜欢写作:

if (n == 0) {
    return 0;
}
else if (n == 1) {
    return 1;
}
else {
    return fib(n-1) + fib(n-2);
}

这是非常易读的代码。我甚至不喜欢省略大括号,因为代码不可读,当你维护代码省略大括号时,你很容易犯错误。

答案 3 :(得分:2)

生活中的一切都是平衡的问题。在频谱的两个相反端之间找到正确的折衷方案。最优性是一种评分函数,它高度依赖于评估者和情况,但你应该争取一切的最佳点。

编程没有什么不同。你应该评估

  • 简单
  • 简洁
  • 效率
  • 实用性
  • 艺术表达自由
  • 时间限制

找到最佳点。

你的第一个结构显然是强大而令人讨厌的,但绝对不容易理解。

答案 4 :(得分:1)

我不喜欢因为它们都太慢了。可读性不应该以运行时指数爆炸为代价,特别是当存在一种在线性时间内运行的简单方法时。

我会这样做(伪代码):

a = 0;
b = 1;
n.times { a, b = b, a + b; }

在C中你不得不使用一个临时变量,但原理是一样的。

答案 5 :(得分:1)

我比第一个更喜欢第二个,主要是为了可读性。

第二个“读取”很好 - 它的代码被破坏了,所以它读起来最像英语。这将使许多开发人员更容易理解。

就我个人而言,我发现有时难以遵循多个链式三元操作。

此外,在大多数情况下,我个人认为“简洁”是一个糟糕的目标。现代IDE使“更长”的代码比以前更易于管理。我并不是说你想要过于冗长,但根据我的经验,尝试简洁往往会导致维护工作的增加。

答案 6 :(得分:1)

如果你要求可读性,我更喜欢第二个选项,因为它不包含(double!)三元运算符。通常你正在编写其他人也必须阅读的代码,从第二个片段开始,乍一看它的功能是什么。然而,在第一个片段中,必须解决“在你脑中”的两个三元运算符,并另外考虑关联性(我会自动考虑这一点,因为缺少括号)。

但无论如何,你可以将两个if语句减少为一个:

if(n <= 1) return n;
return fib(n-1) + fib(n-2);

答案 7 :(得分:1)

在这两者中,第二部分一目了然更容易理解。但是,我将其整合为

if (n <= 1) 
  return n;
else
  return fib(n-1) + fib(n-2);

或者,如果您没有多次退货:

if (n > 1)
  n = fib(n-1) + fib(n-2);
return n;

答案 8 :(得分:1)

我经常发现缩进可以使多元三元运算符更具可读性:

return n == 0 ? 0 :
       n == 1 ? 1 :
                fib(n-1) + fib(n-2); 

答案 9 :(得分:0)

我敢打赌,编译后的代码没有区别。 我至少试着让它更具可读性:

return n==0 ? 0 : ( n==1 ? 1 : fib(n-1) + fib(n+1) );

答案 10 :(得分:0)

在大多数情况下,我更喜欢第二种,但有时候在一行中不做它似乎有点浪费。例如,我更喜欢

text="my stuff_"+id==null ? "default" : id;

text="my stuff_";
if(id==null){
  text+="default";
}else{
  text+=id;
}

注意,这也有助于DRY,因为现在如果您需要更改text的名称,那么您只需在一个地方更改它,而不是3.

答案 11 :(得分:0)

如果您使用?:运算符两到三次,您将习惯它,所以我会选择第一个

答案 12 :(得分:0)

我要说甚至超过@Lauri:

if (n == 0) {
    tmp = 0;
}
else if (n == 1) {
    tmp = 1;
}
else {
    tmp = fib(n-1) + fib(n-2);
}
return tmp;

只有一个退出点是很好的。

答案 13 :(得分:0)

作为一般规则,您应该编写可读代码,这意味着实际阅读它的人最易读的代码。大多数时候,这意味着“你自己,三周后”。当你编写代码时,好的问题是“我下个月能否再次阅读并理解它?”。

除此之外,第一个表达式是错误的(它使用fib(n+1)而不是fib(n-2))并且都表现出指数爆炸,这使得Fibonacci序列成为教授算法的一些重要实践方面的经典工具。