If statement 将案例选择与处理分离

If statement 将案例选择与处理分离,if-statement,design-patterns,optimization,switch-statement,If Statement,Design Patterns,Optimization,Switch Statement,我正在处理数据,有许多案例需要处理。选择正确的案例有一定的复杂性,一旦找到正确的案例,处理过程也会很复杂 我可以用两种不同的方法来解决这个问题: (A) 方法选择正确的进程并调用它 (B) 方法执行选择,将代码返回给控制该过程的另一个方法 (A) 这是我的第一个选择,但是(B)的优点是将选择过程解耦,使其更清晰,并将其与处理过程分离 在伪代码中: ====== option A ====== function doEverything(data) { if (case1(data))

我正在处理数据,有许多案例需要处理。选择正确的案例有一定的复杂性,一旦找到正确的案例,处理过程也会很复杂

我可以用两种不同的方法来解决这个问题:

  • (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
}
我的问题是:有没有适用于这种情况的标准实践?

我最近有一个类似的问题:我想动态地匹配一个类型的层次结构,然后在匹配时执行特定的操作

而不是使用包含if/else构造的方法,该构造封装了匹配规则。您甚至可以更进一步,将匹配方法与其行为解耦,即将其泛化为匹配规则,并将其检索为方法参数

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


为了匹配类型层次结构(本质上是一个节点树),请看下面的内容