0

我一遍又一遍地使用相同的 switch 语句,但每种情况下的功能都不同。

switch(type){
  case "t1": 
    fnA();
    break;  
  case "t2": 
    fnB();
    break;
  ...
}

switch(type){
  case "t1": 
    fnZ();
    break;  
  case "t2": 
    fnY();
    break;
  ...
}

我不知道是否有更好或更聪明的方法来做到这一点。我什么都想不出来,所以我想我会把它扔给你们这些好人。提前致谢。

编辑:为了更清楚地理解它,可以这样想:在第一次切换中,根据类型,数据将以某种方式插入添加到对象中。在第二次切换中,数据将以某种方式从对象中删除。

4

4 回答 4

3

我认为这看起来是使用面向对象编程的好情况。

  1. 为每种类型创建一个类
  2. 每当您需要根据类型执行不同的操作时,请调用 type.someFunction()。使每个类型类以不同的方式实现此功能。
于 2013-02-14T18:56:19.427 回答
1

这可能是在黑暗中拍摄,但我猜在你的代码中多次重复 switch-case 只是一个糟糕的架构决策的结果。

您可能错误地分配了职责。

假设您使用模块而不是面向对象的东西 - 被调用的方法应该是 mixins。或者使用装饰器模式。

于 2013-02-14T19:00:21.367 回答
0

通常 switch 语句不是处理瓶颈,所以它是你优化的最后一件事。

每种情况都会作为测试和跳跃转换到 CPU 上,因此请考虑一下最坏情况会执行多少操作,并决定是否值得大惊小怪,以及实际节省多少操作(最坏情况和平均情况)。

话虽如此,有几个明显的选择。如果您有数字类型并且它们是均匀分布的,您可以将您的 switch 语句拆分为多个 switch....

switch(type){
  case "t1": 
    fnA();
    break;  
  case "t2": 
    fnB();
    break;
  ...
}

switch(type){
  case "t1": 
    fnZ();
    break;  
  case "t2": 
    fnY();
    break;
  ...
}

这当然更难维护,并且可能依赖于使您的代码难看的常量值的知识。它真的只是一个肮脏的搜索树......

另一种方法是将所有案例放入函数中,并构建将每个值映射到函数处理程序的树或哈希表。这样您就可以始终依赖O(logN)搜索时间(或者更好的是,在哈希表的情况下)。我再说一遍:除非你有充分的理由,否则不要这样做。

希望对您有所帮助。

于 2013-02-14T18:50:06.037 回答
0

我会犹豫实施这个解决方案,因为它并不比 a 简洁得多switch,而且更令人困惑。

function doSwitch(expression, options) {
    options[expression]();
}

doSwitch(type, {
    "t1": fnA,
    "t2": fnB
});

doSwitch(type, {
    "t1": fnZ,
    "t2": fnY
});

不要因为性能而这样做——这样做是因为你有大量重复的 switch 语句。如果您有这样的陈述,您可能需要重新评估。

于 2013-02-14T18:51:59.393 回答