三元运算符&保养

时间:2011-05-27 14:45:42

标签: c# maintenance code-readability

程序员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;
}

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

编辑: 还有更好的方法吗?

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

我会在任何一天选择程序员B.聪明的代码只是为了成为聪明的代码通常很难理解和保持,这占你在工作时看屏幕的时间的70%以上。

程序员的B方式很简单,很容易出错。

答案 2 :(得分:3)

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

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

否则可能会很容易混淆。

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

if(condA)
{
    return condB ? 20 : -10;
} else {
    return -20;
}

答案 3 :(得分:2)

首先,它显然是主观的 - 我很想投票以这些理由关闭这个问题。但是,我认为仍然会有一些不太主观的富有成效的观点。

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

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

换句话说,在每种情况下将“简单”情况作为第二个操作数 - 这样我们就可以在每一行上看到“如果这个条件成立,则返回值就是那个”。这样它看起来更像第二个代码,但它有点terser。 (而且我不喜欢像那样在同一条线上使用大括号 - 当你展开那些if块时,它会非常宽松。)

答案 4 :(得分:1)

在我看来,行数并不是可读性的指标。你可以把很多crazy stuff放到一行中,但这并不意味着这条线对每个人都很明显。

我尽量避免使用三元运算符(除了真的琐碎的情况),因为将这些行解析为程序员的费用远远高于节省的空间。

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

示例:对我来说,一个简单的案例就像是

_foo = (bar != null) ? bar : String.Empty;

答案 5 :(得分:0)

我倾向于同意,如果你可以将代码放在一行而不会失去易读性,那就是好的做法。

我喜欢三元运算符,因为它们确实会使代码变得更短,但它们通常需要更长时间才能理解。

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

答案 6 :(得分:0)

这很简单。使用括号。