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

基于一个参数,函数应该从100个以上的json中select一个json文件,并向其他系统发出查询。

将会有数百个查询。

显然如果其他和开关将不可pipe理。 我在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可能会变得很大
所以我想用战略模式来取代它。 这将是最好的devise。 在此先感谢有关此问题的任何build议。

首先,你的关心是非常好的,如果/其他连锁是邪恶的。

当你有一些不同的行为 – 可能很长,也许不相关 – 你必须在运行时根据一些variables值select一个行为,否则创build一个好的列表是没有意义的。 这很难维护,引入风险,很可能是在同一个class级中混合责任,添加新的行为是肮脏的(可以打破旧的东西,意味着修改已经testing过的class级,给已经工作的class级增加新的不同职责),还有很多其他原因。

你已经正确地提到了战略模式。 这将是一个更适合你的问题。 你也可以看看命令模式,但是一般的概念是一样的:将不同的行为封装在不同的类中。

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

简而言之,您将拥有一堆策略类,所有这些都实现了一个方法,可以说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; 

然后你创build工厂类,根据参数创build正确的类。 理想情况下映射值 – >类将在一个configuration文件上,然后注册到工厂类,但为了简单起见,您可以将其硬编码到同一个文件中。 像这样的东西:

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

所以,无论你有多less种不同的行为,不pipe他们有多长,多么复杂或不同,你的主要class级总是看起来一样,简单易行。

    Interesting Posts