diff --git a/Roadmap/21 - CALLBACKS/javascript/kenysdev.js b/Roadmap/21 - CALLBACKS/javascript/kenysdev.js new file mode 100644 index 0000000000..79336679e4 --- /dev/null +++ b/Roadmap/21 - CALLBACKS/javascript/kenysdev.js @@ -0,0 +1,94 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#21 CALLBACKS +--------------------------------------- + * EJERCICIO: + * Explora el concepto de callback en tu lenguaje creando un ejemplo + * simple (a tu elección) que muestre su funcionamiento. + * + * DIFICULTAD EXTRA (opcional): + * Crea un simulador de pedidos de un restaurante utilizando callbacks. + * Estará formado por una función que procesa pedidos. + * Debe aceptar el nombre del plato, una callback de confirmación, una + * de listo y otra de entrega. + * - Debe imprimir un confirmación cuando empiece el procesamiento. + * - Debe simular un tiempo aleatorio entre 1 a 10 segundos entre + *   procesos. + * - Debe invocar a cada callback siguiendo un orden de procesado. + * - Debe notificar que el plato está listo o ha sido entregado. +*/ +// ________________________________________________________ +function sumNumbers(a, b, callback) { + if (typeof a === "number" && typeof b === "number") { + const result = a + b; + callback(`${a} + ${b}`, result); + } + } + + function myCallback(summands, result) { + if (typeof summands === "string" && typeof result === "number") { + console.log(`La suma de ${summands} es: ${result}`); + } + } + + sumNumbers(6, 6, myCallback); + sumNumbers(5, 2, myCallback); + + // ________________________________________________________ + console.log("\nDIFICULTAD EXTRA"); + + function timeRandom() { + return Math.floor(Math.random() * 10) + 1; + } + + function confirmOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Confirmando ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', ha sido confirmado.\n`); + resolve(); + }, time * 1000); + }); + } + + function prepareOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Preparando ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', está listo.\n`); + resolve(); + }, time * 1000); + }); + } + + function servingOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Sirviendo ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', ha sido entregado.\n`); + resolve(); + }, time * 1000); + }); + } + + async function processOrder(name) { + console.log(`-----\n* Procesando: '${name}' \n-----\n`); + await confirmOrder(name); + await prepareOrder(name); + await servingOrder(name); + } + + async function ordersList() { + await processOrder("Baleadas"); + await processOrder("Tamales"); + await processOrder("Enchiladas"); + } + + ordersList(); + \ No newline at end of file diff --git a/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js b/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js new file mode 100644 index 0000000000..2564ec247b --- /dev/null +++ b/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js @@ -0,0 +1,107 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#22 FUNCIONES DE ORDEN SUPERIOR +--------------------------------------- + * EJERCICIO: + * Explora el concepto de funciones de orden superior en tu lenguaje + * creando ejemplos simples (a tu elección) que muestren su funcionamiento. + * + * DIFICULTAD EXTRA (opcional): + * Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y + * lista de calificaciones), utiliza funciones de orden superior para + * realizar las siguientes operaciones de procesamiento y análisis: + * - Promedio calificaciones: Obtiene una lista de estudiantes por nombre + *   y promedio de sus calificaciones. + * - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes + *   que tienen calificaciones con un 9 o más de promedio. + * - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven. + * - Mayor calificación: Obtiene la calificación más alta de entre todas las + *   de los alumnos. + * - Una calificación debe estar comprendida entre 0 y 10 (admite decimales). +*/ +// ________________________________________________________ +function arithmeticOp(func) { + return function (x, y) { + return func(x, y); + }; +} + +function add(x, y) { + return x + y; +} + +function subtract(x, y) { + return x - y; +} + +function multiply(x, y) { + return x * y; +} + +const addition = arithmeticOp(add); +const subtraction = arithmeticOp(subtract); +const multiplication = arithmeticOp(multiply); + +const rAddition = addition(2, 3); +const rSubtraction = subtraction(10, 5); +const rMultiplication = multiplication(2, 5); + +console.log(`\n` + + `Resultado de la suma: ${rAddition} \n` + + `Resultado de la resta: ${rSubtraction} \n` + + `Resultado de la multip.: ${rMultiplication}`); + +// ________________________________________________________ +console.log("\n----\nDIFICULTAD EXTRA\n"); + +const studentsList = [ + { name: "Ken", dob: "2012-04-21", grades: [9.5, 9.4, 9.3, 9.2] }, + { name: "Ben", dob: "2012-03-20", grades: [8.5, 8.4, 8.3, 8.2] }, + { name: "Ada", dob: "2012-02-19", grades: [7.5, 7.4, 7.3, 7.2] }, + { name: "Zoe", dob: "2012-01-18", grades: [9.0, 9.1, 9.0, 9.1] }, +]; + +// Función de orden superior +function higherOrderFun(msg, printFn) { + return function (students) { + console.log(`\n----\n${msg}`); + students.forEach((student) => printFn(student)); + }; +} + +function printGPA(student) { + const grades = student.grades; + const averageGrade = grades.reduce((sum, grade) => sum + grade, 0) / grades.length; + console.log(`${student.name}: ${averageGrade.toFixed(2)}`); +} + +function printTop(student) { + const grades = student.grades; + const average = grades.reduce((sum, grade) => sum + grade, 0) / grades.length; + if (average >= 9) console.log(student.name); +} + +function printBirth(student) { + console.log(`${student.name}: ${student.dob}`); +} + +function printHighestGrade(student) { + const maxGrade = Math.max(...student.grades); + console.log(`${student.name}: ${maxGrade}`); +} + +const gradePointAverage = higherOrderFun("Promedio de calificaciones:", printGPA); +const topStudents = higherOrderFun("Mejores estudiantes:", printTop); +const birthOrder = higherOrderFun("Orden de nacimiento:", printBirth); +const highestGrade = higherOrderFun("Mayor calificación:", printHighestGrade); + +gradePointAverage(studentsList); +topStudents(studentsList); +birthOrder( + [...studentsList].sort((a, b) => new Date(a.dob) - new Date(b.dob)) +); + +highestGrade(studentsList); diff --git a/Roadmap/23 - SINGLETON/javascript/kenysdev.js b/Roadmap/23 - SINGLETON/javascript/kenysdev.js new file mode 100644 index 0000000000..fcf9b7a029 --- /dev/null +++ b/Roadmap/23 - SINGLETON/javascript/kenysdev.js @@ -0,0 +1,72 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#23 PATRONES DE DISEÑO: SINGLETON +--------------------------------------- +* EJERCICIO: + * Explora el patrón de diseño "singleton" y muestra cómo crearlo + * con un ejemplo genérico. + * + * DIFICULTAD EXTRA (opcional): + * Utiliza el patrón de diseño "singleton" para representar una clase que + * haga referencia a la sesión de usuario de una aplicación ficticia. + * La sesión debe permitir asignar un usuario (id, username, nombre y email), + * recuperar los datos del usuario y borrar los datos de la sesión. +*/ +// ________________________________________________________ + +class Singleton { + constructor() { + if (Singleton.instance) { + return Singleton.instance; + } + Singleton.instance = this; + } +} + +const singleton1 = new Singleton(); +const singleton2 = new Singleton(); + +console.log(singleton1 === singleton2); // true + +// ________________________________________________________ +console.log("\nDIFICULTAD EXTRA\n"); + +class UserSession { + constructor() { + if (UserSession.instance) { + return UserSession.instance; + } + this.user = null; + UserSession.instance = this; + } + + setUser(userId, username, name, email) { + this.user = { + id: userId, + username, + name, + email, + }; + } + + getUser() { + return this.user; + } + + logout() { + this.user = null; + } +} + +const session1 = new UserSession(); +session1.setUser(1, "Zoe_1", "Zoe", "Zoe@gm.com"); +console.log(session1.getUser()); +session1.logout(); + +const session2 = new UserSession(); +session2.setUser(2, "Ben_1", "Ben", "Ben@gm.com"); +console.log(session2.getUser()); +session2.logout(); diff --git a/Roadmap/24 - DECORADORES/javascript/kenysdev.js b/Roadmap/24 - DECORADORES/javascript/kenysdev.js new file mode 100644 index 0000000000..f53641e055 --- /dev/null +++ b/Roadmap/24 - DECORADORES/javascript/kenysdev.js @@ -0,0 +1,70 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#24 DECORADORES +--------------------------------------- + * EJERCICIO: + * Explora el concepto de "decorador" y muestra cómo crearlo + * con un ejemplo genérico. + * + * DIFICULTAD EXTRA (opcional): + * Crea un decorador que sea capaz de contabilizar cuántas veces + * se ha llamado a una función y aplícalo a una función de tu elección. +*/ +// ________________________________________________________ +function myDecorator(func) { + return function (...args) { + console.log("\nAntes de que se llame a la función."); + func(...args); + console.log("Después de llamarla."); + }; + } + + function sayHello(firstName, lastName) { + console.log(`Hola, ${firstName} ${lastName}!`); + } + + const decoratedSayHello = myDecorator(sayHello); + decoratedSayHello("Zoe", "Roy"); + + console.log("\n______________________"); + function classDecorator(Class) { + return class extends Class { + greet() { + console.log("\nAntes de llamar al método"); + super.greet(); + console.log("Después de llamar al método"); + } + }; + } + + // ________________________________________________________ + console.log("DIFICULTAD EXTRA"); + + function countCalls(func) { + const wrapper = function (...args) { + wrapper.calls++; + func(...args); + console.log(`Ha sido llamada ${wrapper.calls} veces.`); + }; + wrapper.calls = 0; + return wrapper; + } + + const functionA = countCalls(function (funcName) { + console.log(`\nLa función '${funcName}':`); + }); + + const functionB = countCalls(function (funcName, example) { + console.log(`\nLa función ${funcName} - ${example}:`); + }); + + functionA("A"); + functionA("A"); + functionA("A"); + + functionB("B", "args"); + functionB("B", "args"); + \ No newline at end of file diff --git a/Roadmap/25 - LOGS/javascript/kenysdev.js b/Roadmap/25 - LOGS/javascript/kenysdev.js new file mode 100644 index 0000000000..de02be45dd --- /dev/null +++ b/Roadmap/25 - LOGS/javascript/kenysdev.js @@ -0,0 +1,99 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#25 LOGS +--------------------------------------- +* EJERCICIO: + * Explora el concepto de "logging" en tu lenguaje. Configúralo y muestra + * un ejemplo con cada nivel de "severidad" disponible. + * + * DIFICULTAD EXTRA (opcional): + * Crea un programa ficticio de gestión de tareas que permita añadir, eliminar + * y listar dichas tareas. + * - Añadir: recibe nombre y descripción. + * - Eliminar: por nombre de la tarea. + * Implementa diferentes mensajes de log que muestren información según la + * tarea ejecutada (a tu elección). + * Utiliza el log para visualizar el tiempo de ejecución de cada tarea. +*/ +// ________________________________________________________ + +import { createLogger, transports, format } from 'winston'; + +const logger = createLogger({ + level: 'debug', + format: format.combine( + format.timestamp(), + format.printf(({ timestamp, level, message }) => { + return `${timestamp} - ${level} - ${message}`; + }) + ), + transports: [ + new transports.Console() + ] +}); + +logger.debug('Depuración'); + +logger.info('Informativo'); + +logger.warn('Advertencia'); + +logger.error('Error'); +logger.error('Error crítico'); + +// ________________________________________________________ +console.log("\nDIFICULTAD EXTRA"); + +function showTime(func) { + return async function (...args) { + const startTime = Date.now(); + await func.apply(this, args); + const endTime = Date.now(); + const executionTime = (endTime - startTime) / 1000; + logger.debug(`Tiempo de ejecución de ${func.name}: ${executionTime.toFixed(21)} segundos.`); + }; +} + +class Program { + constructor() { + this.tasks = {}; + logger.debug('Se inició instancia de la clase.'); + } + + add = showTime(async function (name, description) { + this.tasks[name] = description; + logger.info('Se agregó una tarea.'); + }); + + delete = showTime(async function (name) { + if (name in this.tasks) { + delete this.tasks[name]; + logger.info(`Tarea '${name}' eliminada.`); + } else { + logger.warn(`No se encontró la tarea '${name}'.`); + } + }); + + showList = showTime(async function () { + logger.info('Lista de tareas'); + for (const [task, des] of Object.entries(this.tasks)) { + console.log(`${task} -- ${des}`); + } + }); +} + +const tasks = new Program(); + +(async () => { + await tasks.add("a", ".1"); + await tasks.add("b", "2"); + await tasks.add("c", "3"); + + await tasks.delete("a"); + await tasks.showList(); + + await tasks.delete("a"); +})();