将案例选择与处理分离

时间:2017-03-09 12:48:26

标签: if-statement design-patterns optimization switch-statement

我正在处理数据,有许多案件需要处理。选择正确的案例涉及一些复杂性,一旦找到正确的案例,处理也是如此。

我可以通过两种不同的方式解决问题:

  • (A)方法选择正确的过程并调用它
  • (B)方法执行选择,将代码返回给控制该过程的另一个代码。

(A)是我的第一个选择,但(B)的优点是将选择过程分离,使其更清晰,并将其与处理分开。

在伪代码中:

====== option A ======

function doEverything(data) {
   if (case1(data))
       return doCase1(data)
   else {
       doStuff(data) // applies to all cases except case1
       if (case2(data)) {
          doStuff2()
          return doCase2(data)
       }
       else if (case3(data)) {
          return doCase3(data)
       }
       else return doDefaultCase(data)
   }
   return result
}

或者:

====== option B ======

function doChoice(data) {
   if (case1(data)) return 1
   doStuff(data) // applies to all except case1
   if (case2(data)) return 2
   if (case3(data)) return 3
   return 4 // default
}

function doProcess(data) {
   which = choice(data)
   switch (which) {
   case 1:
      return doCase1(data)
      break
   case 2:
      doStuff2()
      return doCase2(data)
      break
   case 3:
      return doCase3(data)
      break
   case 4:
      return doDefaultCase(data)
   default:
      raise an error
}

我的问题是:是否存在适用于这种情况的标准做法?

1 个答案:

答案 0 :(得分:1)

我最近有类似的question:我希望动态类型层次匹配,然后在匹配时执行特定操作。

而不是一个由if / else构造组成的方法,它封装了匹配的规则。您甚至可以更进一步,将匹配方法与其行为分离,即将其概括为与规则匹配,并将其作为方法参数检索。

如果您在下面的层次结构中封装规则/条件以进行匹配,则这是可能的。稍后您可以使用此层次结构进行匹配,并根据匹配类型使用操作。

example hierarchy

为了匹配类型层次结构(本质上是节点树),请查看以下answer