重构条件变量赋值

时间:2013-03-20 22:15:52

标签: ruby refactoring

我正在开展一个项目。目前我有一个相当大的条件语句,它根据一些输入参数为变量赋值。所以,我有类似的东西。

if some condition
  x = some value
elsif another condition
  x = a different value
  ...

重构这个的最佳方法是什么?我希望我最终会得到像

这样的东西
x = some value if some condition || another value if another condition

这种事情有没有模式?

5 个答案:

答案 0 :(得分:11)

只需将作业放在if。

之外
x = if some condition
  some value
elsif another condition
  a different value

或者你可以使用哈希。

x = dict[some condition]

答案 1 :(得分:1)

条件语句也是一个表达式,因此,如果变量在每个条件中相同,那么您可以做的第一件事就是:

x = if cond1
  expr1
elsif cond2
  expr2
....
end

如果条件是单个表达式的所有状态,则可以使用case语句使其更整洁。

然而,下一个最明显的重新分解练习是将大条件分离到一个方法中,该方法应该提供评估所有条件和表达式所需的最小数据。

E.g。

# Where conditional is currently, and x assigned, assuming the conditionals
# need a couple of variables . . .
x = foo param1, param2

# Elsewhere
private

def foo p1, p2
  if cond1
    expr1
  elsif cond2
    expr2
  ....
  end
end

答案 2 :(得分:0)

这不是一种模式,而是一种运营商。你指的是三元运算符:

If Condition is true ? Then value X : Otherwise value Y

以下是一个例子:

speed = 90
speed > 55 ? puts("I can't drive 55!") : puts("I'm a careful driver")

使用三元语句简短,甜蜜,并且完成工作。

答案 3 :(得分:0)

x = some condition ? some value : 
    another condition ? a different value : ...

答案 4 :(得分:0)

如果您想重构代码清晰度和灵活性,请考虑replacing conditional with polymorphism重构。

在你的问题中没有足够的细节来进一步提出建议,但是这个重构将使你的代码库更能抵抗变化。如果你收到一个新的要求,打破条件并修改它是不好的形式(更容易引入错误,更难做);最好创建一个可以插入现有代码库的新对象。这种灵活性是Open/Closed Principle(SOLID首字母缩略词中的“O”)所描述的。