我有一个if语句,如下所示:
if conditionA() || conditionB() || conditionC() || conditionD() || conditionE() || condition()
#do sth
end
#conditionX() methods return true/false
这看起来很难看。有没有设计模式可以简化这个?
*使用的语言:Ruby。虽然我认为解决方案应该与语言无关
答案 0 :(得分:4)
如果有太多的条件超出可维护性,你可以做的最好的事情是抽象。
Boolean
个返回方法,然后在if
块中调用这些方法。答案 1 :(得分:2)
在Agile Programming: Design to Accommodate Change中,Dave Thomas建议决策表:
很少有开发人员熟悉决策 表格 - 最简单的表格之一 最强大的交易技巧 复杂的逻辑。决策表是 独特之处在于最终用户可以轻松实现 指定并维护它。该表包括 一组条件放在上面 要执行的一系列操作(参见表1)。
它们肯定是语言不可知的,因为它们自20世纪70年代初开始使用。
答案 2 :(得分:1)
这通常是switch
(C,Java)或case
(Ruby)语句的用途:
shouldAct = false
case
when <condition A>
shouldAct = true
when <condition B>
shouldAct = true
when <condition C>
shouldAct = true
else
shouldAct = false
end
doSomething() if shouldAct
在Python中,有一个使用lambdas元组的简洁解决方案:
conditions = (
lambda a : a == 1,
lambda b : b == 2,
lambda c : c == 3,
)
# evaluate each condition separately
a,b,c = 1,2,3
if any(map(lambda x, y : x(y), conditions, [a,b,c])):
soSomething()
请注意,这里只使用一个参数调用每个lambda。
答案 3 :(得分:1)
没有完整的背景就很难分辨。
您拥有的一个选项是从基类继承并具有conditionA(),conditionB()等基本条件()方法的实现。这有其优点,但可能不适合这个例子。
另一种选择是将condition()方法作为参数传递给使用条件本身的方法。这个选项假设有一种聪明的方法来存储要传递给方法的condition()方法。