如何避免 javascript 中的大量 if-else (nodejs)

How to avoid lots of if-else in javascript (nodejs)

根据一个参数,函数应该 select 一个 json 文件,超过 100 个 json 并向其他系统发出查询。

大约有数百个查询。

显然 if else 和 switch 将无法管理。我在 javascript.

中查看了策略模式
var queryCode = req.param('queryCode');

  if(queryCode == 'x'){
    //do something
  } else if( queryCode == 'y'){
    //do something
  } else if( queryCode == 'z') {
    //do something
  }

// do something 有时会变大...
所以我想用策略模式之类的东西来代替它。这将是最好的设计。 在此先感谢您对此问题的任何建议。

首先,你的关心真好,if/else锁链是邪恶的。

当你有一些不同的行为时——可能很长,可能不相关——并且你必须在运行时根据一些变量值选择一个,那么创建一个 if else 的大列表是没有意义的。这将难以维护,引入风险,很可能也在同一个 class 中混合职责,添加新行为是肮脏的(可能破坏旧事物并意味着修改已经测试过的 classes,添加新的不同已经工作的责任 class) 和许多其他原因。

您提到 Strategy pattern. This will be the one that fits better your problem. You can also take a look at the Command 模式已经是正确的,但一般概念是相同的:将不同的行为封装在单独的 class 中。

然后您可以使用 Factory 来检索要使用的正确策略。

简而言之,您将有一堆策略 classes,它们都实现了一个方法,比方说 execute

//strategyA.js

function StrategyA(){    
}
StrategyA.prototype = {
    execute: function() {
        //custom behavior here
    }
}  
module.exports = StrategyA;

//strategyB.js

function StrategyB(){    
}
StrategyB.prototype = {
    execute: function() {
        //custom behavior here
    }
}  
module.exports = StrategyB;

然后您创建工厂 class,根据参数创建正确的 class。映射值->class 理想情况下应该在配置文件中,然后将其注册到工厂 class,但为简单起见,您可以将其硬编码在同一个文件中。像这样:

//factory.js

 var  StrategyA = require('./strategyA.js'), 
     StrategyB = require('./strategyB.js');
 var _ = require('underscore');//asuming you have underscore

 module.exports = function () {

   var serviceDescriptions: [
         { name: 'a', service:  StrategyA}, 
         {name: 'b', service:  StrategyB}
    ];

 var getStrategy: function (name) {
    //asuming you have underscore, otherwise, just iterate the array to look for the proper service
    return _.find(this.serviceDescriptions, {name: name}).service; 
 };

}

有了这一切,开始就更复杂了,但特别是如果你有很多不同的策略,或者将来必须添加更多,这将是一个很好的中期投资。您的主要代码将像以下一样简单:

var Factory = require("factory.js");
...
var queryCode = req.param('queryCode');
var strategy = Factory.getStrategy(queryCode);

strategy.execute()

因此,无论您有多少种不同的行为,或者它们有多长、多复杂或不同,您的主要 class 看起来总是一样的,简单易懂。