Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions Roadmap/21 - CALLBACKS/javascript/kenysdev.js
Original file line number Diff line number Diff line change
@@ -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();

107 changes: 107 additions & 0 deletions Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js
Original file line number Diff line number Diff line change
@@ -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);
72 changes: 72 additions & 0 deletions Roadmap/23 - SINGLETON/javascript/kenysdev.js
Original file line number Diff line number Diff line change
@@ -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", "[email protected]");
console.log(session1.getUser());
session1.logout();

const session2 = new UserSession();
session2.setUser(2, "Ben_1", "Ben", "[email protected]");
console.log(session2.getUser());
session2.logout();
70 changes: 70 additions & 0 deletions Roadmap/24 - DECORADORES/javascript/kenysdev.js
Original file line number Diff line number Diff line change
@@ -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");

Loading