从控制流(if,switch)中进行赋值是一种好的编程风格吗?

3
我见过很多这样编写的代码;
conditional_value = if thing_is_true
                      true_value
                    else
                      other_value
                    end

我对此感到矛盾。一方面,使用条件返回值(或任何其他语法块,如switch、begin/ends、循环甚至函数定义)可以减少冗余并清晰地表明代码正在做什么。另一方面,缩进经常会让人感到不适和困惑。

作为第二种可能性,如果决定将所有行缩进到第一行开头的级别,那就破坏了整个结构的视觉线索。

conditional_value = if thing_is_true
  true_value
else
  other_value
end

这里有第三种选择(至少在Ruby中),它依赖于换行符;
conditional_value =
  if thing_is_true
    true_value
  else
    other_value
  end

第四种选择是勇敢地在每个分支中放置赋值语句。
if thing_is_true
  conditional_value = true_value
else
  conditional_value = other_value
end

我担心这会变成一个“看法”问题,但我认为有些事实我不知道;

  • 这些风格在专业代码中经常出现吗?
  • 人们阅读起来容易吗?
  • 这些风格中是否常见导致错误的情况?
  • 这些风格如何维护或破坏代码的视觉呈现的完整性?
2个回答

3
我只会将三元运算符的结果赋值给val = condition ? true_value: false_value,而不是if语句的值。这可能只是来自Java/C/C++的一个习惯,但使用if这种方式似乎有可能混淆流程控制和表达式值。你在上面提到的第四个选择在这种风格下也可以使用。
但如果你有一致的风格,包括使用if的值,那么也没问题。

0

我认为,当代码以赋值符号开始时,它会让读者更清楚地了解代码的意图。也就是说,如果我在调试该代码时,已经知道从条件语句中分配的变量正在运作良好(即不是错误源),那么我可以完全跳过整个块,而无需浪费脑细胞来查找其中是否存在副作用。

在没有简洁的if else格式的语言中,这肯定会变得麻烦,但在具有三元运算符(? :)和合理的操作顺序(即非PHP)的语言中,我也很喜欢这种样式,用于任意嵌套的条件语句:

var x = someCondition ? a
      : somethingElse ? b
      : anotherThing  ? c
                      : d;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接