En Javascript, cuando usamos if else o switch, si el valor es un valor de cadena, podemos usar un patrón de estrategia para eliminar if else o cambiar por object[key] :
const strategies = { strategyA: ()=> { console.log("strategyA") }, strategyB: ()=> { console.log("strategyB") } } Digamos aquí que tengo dos estrategias, A y B y puedo ejecutar por strategies[strategyValue]()
Pero, ¿cómo puedo configurar la estrategia si no es una cadena? Por ejemplo, en Fn1, el valor es undefined o test o el resto; y en Fn2, tengo el valor con otro valor.
Con estos escenarios, no puedo usar la forma object[key] . ¿Cómo puedo convertirlos al patrón de estrategias?
const Fn1 = (value) => { const initValue = "" if (!value) return initValue if (value === "test") { return { test: "test", } } return { otherCondition: "otherCondition", } } const Fn2 = (value) => { switch (value) { case 1: { return 'a1' } case 2: { return 'c2' } case 3: { return 'b3' } default: { return "other value" } } }Normalmente, inyectaría la estrategia que debe usarse en función de la entrada o la configuración. ¿Cuándo se debe usar Fn2 en lugar de Fn1?
const Fn1 = (value) => { ... } const Fn2 = (value) => { ... } const doSomethingWithStrategy = (value, strategyCallback) => { return strategyCallback(value); } const valueForStrategy = 1; const strategy = (valueForStrategy instanceof String) ? Fn1 : Fn2; doSomethingWithStrategy(valueForStrategy, strategy);Dado que está utilizando funciones, también podría implementar la condición en las propias estrategias y encadenarlas/hacer un bucle.
const Fn1 = (value) => { if (value instanceof Number) { return false; } ... } const Fn2 = (value) => { ... } const doSomethingWithStrategies = (value, strategyCallbacks) => { for (let index = 0; index < strategyCallbacks.length; index++) { const returnValue = strategyCallbacks[index](value); if (returnValue) { return returnValue; } } } doSomethingWithStrategies(1, [Fn1, Fn2]);