He estado trabajando en una aplicación de calculadora simple usando javascript del lado del cliente y he implementado la lógica del programa para las operaciones matemáticas básicas +, -, x, /
. El código se implementa como funciones de devolución de llamada para que puedan usarse en controladores de eventos.
add = (a , b) => a + b subtract = (a , b) => a - b multiply = (a, b) => a * b divide = (a, b) => a / b
He leído que las funciones de fábrica son útiles en situaciones como esta donde la estructura de cada función es similar. Sin embargo, no estoy seguro de cómo puede crear funciones de fábrica, el conjunto que se asignará son operadores. Algo como, createOperation("add")
devolvería (a , b) => a + b
, createOperation("subtract")
devolvería (a, b) => a - b
etc.
Mi primer pensamiento fue convertir todo en una cadena, concatenarlos y luego regresar usando eval. Algo así como eval("(example) => example.output")
. Por lo que he leído en los documentos de MDN y en otros lugares, esto es muy desaconsejable.
¿Hay alguna manera de lograr esto sin recurrir al truco de eval
?
function createOperation(operator, { a, b }) { switch (operator) { case "add": return a + b; case "substract": return a - b; // .... implement for mul and div operator default: throw new Error("please provide correct operator"); } } const result = createOperation("substract", { a: 3, b: 5 }); console.log(result);
El uso de mapeo y una función de fábrica puede verse así. También puede usar una enum
para contener nombres de acción :)
const mapping = { mul: (a, b) => a * b, add: (a, b) => a + b }; const factory = (action) => { if (mapping.hasOwnProperty(action)) { return mapping[action]; } throw new Error("Action does not exist"); }; const add = factory("add"); console.log(add(1, 2));
En este ejemplo, tenemos una variable de mapping
, que asigna la tecla de acción a la función respectiva. La función de factory
recupera cada acción de esta variable de mapping
y la devuelve. No se encontró ninguna clave; por lo general, no se debe permitir, por lo que se genera un Error
.
Puede usar Map
, en lugar de un objeto, especialmente útil si las claves no pueden ser de tipo cadena.