重构条件变量赋值

6

我正在进行一个项目。目前我有一条相当大的条件语句,根据一些输入参数来给变量赋值。所以,我有这样的代码。

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

如何最好地重构这个代码?我希望最终得到的是类似于以下这样的结果:

x = some value if some condition || another value if another condition

这种事情有没有规律可循?

在我们告诉你如何重构之前,你需要告诉我们为什么你想要重构这个。你试图解决什么问题? - Daniel Hilgarth
2
refactor = nil unless exist?(:unit_tests) - dbenhur
5个回答

13

将赋值语句放在if语句外部即可。

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

或者你可以使用哈希。

x = dict[some condition]

1

这不是一个模式,而是一个运算符。你所指的是三目运算符:

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

Here is an example:

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

使用三元运算符简洁明了,而且能够完成任务。

我的条件判断比 if then else 语句更长。 - afkbowflexin
那我会坚持使用 if/elsif 语句。使用它们没有任何问题。 - BlackHatSamurai
puts (speed > 55) ? "I can't drive 55!" : "I'm a careful driver" - ZiggidyCreative

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

1

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

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

如果所有条件都是单个表达式的状态,则可以使用case语句使其更加简洁。
然而,下一个最明显的重构练习是将大的条件分离成一个方法,该方法应提供评估所有条件和表达式所需的最少数据。
例如:
# 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

0

如果你想要重构代码以提高代码清晰度和灵活性,考虑用多态替换条件语句的重构。

根据你提供的信息,很难进一步推荐,但这种重构将使你的代码库更具抗变性。如果你收到了新需求,打开条件语句并进行修改是不好的做法(更容易引入错误,更难做到);最好的方法是创建一个新对象并将其插入现有的代码库中。这种灵活性正是开闭原则(SOLID 缩写中的“O”)所描述的。


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