1

На основе параметра функция должна выбрать json-файл из более 100 json и запустить запрос в другую систему.Как избежать большого количества if-else в javascript (nodejs)

В сотнях запросов будет много запросов.

Очевидно, что если еще и переключатель не будет управляемым. Я просмотрел стратегию patten в 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 может стать большим иногда ...
поэтому я хочу, чтобы заменить его что-то вроде стратегии шаблона. Какой будет лучший дизайн. Заранее благодарим за любое предложение по этой проблеме.

+1

Вы можете использовать объект в качестве словаря, сопоставляя параметры с именами файлов. – Gio

+0

Взгляните на [Альтернатива миллионам IF-операторов] (http: // stackoverflow.com/q/10029089/1048572) – Bergi

+0

@CarlosRobles: вы можете легко отображать параметры для функций - они также являются значениями. Различные подходы являются составными, вы должны выбрать структуру, которая объединяет их по мере необходимости. – Bergi

ответ

3

Прежде всего, ваша забота действительно хороша, если/еще цепи злы.

Если у вас есть разные поведения - может быть длинный, возможно, несвязанный, и вы должны выбрать один из них во время выполнения на основе некоторого значения переменной, нет смысла создавать отличный список 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() 

Таким образом, независимо от того, сколько различных поведения у вас есть, или как долго или сложные или разные они, ваш главный класс будет всегда выглядеть так же, просто и легко следовать.

+0

Спасибо Карлос. Это было действительно полезно. –

Смежные вопросы