【问题标题】:Decouple case selection from processing将案例选择与处理分离
【发布时间】:2017-03-09 12:48:25
【问题描述】:

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

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

  • (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-statement design-patterns optimization switch-statement


    【解决方案1】:

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

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

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


    为了匹配一个类型层次结构,它本质上是一个节点树,看看下面的answer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多