Прежде всего, ваша забота действительно хороша, если/еще цепи злы.
Если у вас есть разные поведения - может быть длинный, возможно, несвязанный, и вы должны выбрать один из них во время выполнения на основе некоторого значения переменной, нет смысла создавать отличный список 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;
Затем вы создаете фабричный класс, который создает правильный класс в соответствии с параметром. Класс value-> 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()
Таким образом, независимо от того, сколько различных поведения у вас есть, или как долго или сложные или разные они, ваш главный класс будет всегда выглядеть так же, просто и легко следовать.
Вы можете использовать объект в качестве словаря, сопоставляя параметры с именами файлов. – Gio
Взгляните на [Альтернатива миллионам IF-операторов] (http: // stackoverflow.com/q/10029089/1048572) – Bergi
@CarlosRobles: вы можете легко отображать параметры для функций - они также являются значениями. Различные подходы являются составными, вы должны выбрать структуру, которая объединяет их по мере необходимости. – Bergi