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

时间:2015-10-28 11:26:44

标签: javascript node.js if-statement design-patterns strategy-pattern

基于参数,函数应该从更多100个json中选择一个json文件并向其他系统发出查询。

有数百个查询。

显然,如果不这样,那么开关就不会变得易于管理。我在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有时会变大......
所以我想用战略模式取代它。哪个是最好的设计。 提前感谢您对此问题的任何建议。

1 个答案:

答案 0 :(得分:4)

首先,如果/其他链是邪恶的,你的关注真的很好。

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

你已经正确地提到了Strategy模式。这将是更适合您的问题的那个。您还可以查看Command模式,但一般概念将是相同的:将不同的行为封装在不同的类中。

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

简而言之,您将拥有一堆策略类,所有实现方法,让我们说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;

然后创建工厂类,根据参数创建正确的类。理想情况下,映射值 - >类将位于confing文件上,然后将其注册到工厂类,但为简单起见,您可以在同一文件中对其进行硬编码。像这样:

// 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()

所以,无论你有多少不同的行为,或者它们有多长或多复杂或不同,你的主要课程总是看起来一样,简单易懂。