如何避免大量的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级总是看起来一样,简单易行。