具有许多条件的if语句的良好体系结构

时间:2015-02-12 12:07:29

标签: design-patterns if-statement architecture

我有一个if语句,如下所示:

if conditionA() || conditionB() || conditionC() || conditionD() || conditionE() || condition()
  #do sth
end
#conditionX() methods return true/false

这看起来很难看。有没有设计模式可以简化这个?

*使用的语言:Ruby。虽然我认为解决方案应该与语言无关

4 个答案:

答案 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()方法。