5

我正在做一个项目。目前我有一个相当大的条件语句,它根据一些输入参数为变量赋值。所以,我有这样的事情。

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

重构它的最佳方法是什么?我希望我最终可能会得到类似的东西

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

这种事情有模式吗?

4

5 回答 5

12

只需将作业放在 if 之外。

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

或者你可以使用哈希。

x = dict[some condition]
于 2013-03-20T22:27:38.467 回答
1
x = some condition ? some value : 
    another condition ? a different value : ...
于 2013-03-20T22:27:40.947 回答
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
于 2013-03-20T22:30:37.460 回答
1

它不是一个模式,而是一个操作符。您指的是三元运算符:

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")

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

于 2013-03-20T22:23:32.727 回答
0

如果要重构代码的清晰度和灵活性,请考虑使用多态重构替换条件。

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

于 2016-04-04T15:48:17.510 回答