如何避免 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 看起来总是一样的,简单易懂。
根据一个参数,函数应该 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 看起来总是一样的,简单易懂。