如何避免在 javascript (nodejs) 中使用大量 if-else

fre*_*erz 5 javascript design-patterns if-statement strategy-pattern node.js

根据参数,函数应从 100 个 json 中选择一个 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
  }
Run Code Online (Sandbox Code Playgroud)

// do something有时可能会变大......
所以我想用策略模式替换它。这将是最好的设计。预先感谢您对此问题的任何建议。

Car*_*les 9

首先,如果/else 链是邪恶的,您的关注真的很好。

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

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

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

简而言之,你将有一堆策略类,都实现了一个方法,让我们说 execute

//策略A.js

function StrategyA(){    
}
StrategyA.prototype = {
    execute: function() {
        //custom behavior here
    }
}  
module.exports = StrategyA;
Run Code Online (Sandbox Code Playgroud)

//策略B.js

function StrategyB(){    
}
StrategyB.prototype = {
    execute: function() {
        //custom behavior here
    }
}  
module.exports = StrategyB;
Run Code Online (Sandbox Code Playgroud)

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

//工厂.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; 
 };

}
Run Code Online (Sandbox Code Playgroud)

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

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

strategy.execute()
Run Code Online (Sandbox Code Playgroud)

因此,无论您有多少不同的行为,或者它们有多长、多复杂或多不同,您的主类将始终看起来相同、简单且易于遵循。