0

程序员 A 只是喜欢一些三元运算符,尤其是嵌套运算符。更好的是,他声称它们使代码更易于阅读和维护,因为它们可以放在更少的行上。程序员 B 认为,当三元组嵌套时,可读性会丢失,进而代码变得更难维护。

查看下面的块:

private int MyFunction(bool condA, bool condB)
{
  // Programmer A says:
  // Nested ternary --> This is easier to read and maintain because it is on one line.  Ternaries can be nested 4 or 5 deep and it is no problem.
  return condA ? condB ? 20 : -10 : -20;

  // Programmer B says:
  // Unwrapped --> This is more readable as it better describes the step by step evaluation of the conditions and their results.
  if (!condA) { return -20; }
  if (!condB) { return -10; }
  return 20;
}

其他人如何看待这两种思想流派?最好的方法是什么?

编辑:有更好的方法吗?

4

7 回答 7

8

显然,程序员 A 将“短”代码与“可维护和可读”代码混淆了。

于 2011-05-27T14:49:45.267 回答
4

任何一天我都会选择程序员B。仅仅为了聪明而聪明的代码通常很难理解和维护,这占你在工作中看屏幕的时间的 70% 以上。

程序员的 B 方式简单明了,很难出错。

于 2011-05-27T14:50:05.990 回答
3

我认为最好的解决方案是保留三元运算符但添加括号

return condA ? ( condB ? 20 : -10 ) : -20;

否则很容易混淆。

或者,混合方法可能是最好的,其中三元运算符仅出现在嵌套的最后一层。

if(condA)
{
    return condB ? 20 : -10;
} else {
    return -20;
}
于 2011-05-27T14:50:15.910 回答
2

首先,这显然是主观的——无论如何,我很想以这些理由投票结束这个问题。但是,我认为仍然可以提出一些不那么主观的富有成效的观点。

我会以不同的方式编写它,但仍然使用条件运算符。我会用这个:

return !condA ? -20
     : !condB ? -10
     : 20;

换句话说,让“简单”的情况成为每种情况下的第二个操作数——这样我们就可以在每一行看到,“如果这个条件成立,返回值就是那个。” 这样它看起来有点像第二个代码,但它有点简洁。(而且我不喜欢像那样在同一行上放置大括号——当你把这些if块展开时,它会很冗长。)

于 2011-05-27T14:49:10.200 回答
1

在我看来,行数并不是可读性的指标。你可以把很多疯狂的东西放在一条线上,但这并不意味着这条线的作用对每个人来说都是显而易见的。

我尝试完全避免三元运算符(除了非常琐碎的情况),因为作为程序员解析这些行的费用明显高于节省的空间。

对于嵌套语句(例如您的示例)尤其如此。

示例:对我来说,一个微不足道的案例就像

_foo = (bar != null) ? bar : String.Empty;
于 2011-05-27T14:49:50.050 回答
0

我倾向于同意,如果您可以将代码放入一行而不失去易读性,那么它是一种很好的做法。

我喜欢三元运算符,因为它们确实倾向于使代码更短一些,但它们通常需要一秒钟的时间才能理解。

嵌套三元运算符永远不会在我监督的任何项目中占有一席之地。代码必须优先考虑易读性,而嵌套三元运算在我看来太过分了。

于 2011-05-27T14:50:28.120 回答
0

这很简单。使用括号。

于 2011-05-27T14:51:07.863 回答