Skip to content

Commit 89c9801

Browse files
authored
Merge pull request mouredev#7502 from Kenysdev/21_25.js
#21 - javascript -> #25
2 parents a5cbb01 + 53aef0d commit 89c9801

File tree

5 files changed

+442
-0
lines changed

5 files changed

+442
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
_____________________________________
3+
https://github.com/kenysdev
4+
2024 - JavaScript
5+
_______________________________________
6+
#21 CALLBACKS
7+
---------------------------------------
8+
 * EJERCICIO:
9+
 * Explora el concepto de callback en tu lenguaje creando un ejemplo
10+
 * simple (a tu elección) que muestre su funcionamiento.
11+
 *
12+
 * DIFICULTAD EXTRA (opcional):
13+
 * Crea un simulador de pedidos de un restaurante utilizando callbacks.
14+
 * Estará formado por una función que procesa pedidos.
15+
 * Debe aceptar el nombre del plato, una callback de confirmación, una
16+
 * de listo y otra de entrega.
17+
 * - Debe imprimir un confirmación cuando empiece el procesamiento.
18+
 * - Debe simular un tiempo aleatorio entre 1 a 10 segundos entre
19+
 *   procesos.
20+
 * - Debe invocar a cada callback siguiendo un orden de procesado.
21+
 * - Debe notificar que el plato está listo o ha sido entregado.
22+
*/
23+
// ________________________________________________________
24+
function sumNumbers(a, b, callback) {
25+
if (typeof a === "number" && typeof b === "number") {
26+
const result = a + b;
27+
callback(`${a} + ${b}`, result);
28+
}
29+
}
30+
31+
function myCallback(summands, result) {
32+
if (typeof summands === "string" && typeof result === "number") {
33+
console.log(`La suma de ${summands} es: ${result}`);
34+
}
35+
}
36+
37+
sumNumbers(6, 6, myCallback);
38+
sumNumbers(5, 2, myCallback);
39+
40+
// ________________________________________________________
41+
console.log("\nDIFICULTAD EXTRA");
42+
43+
function timeRandom() {
44+
return Math.floor(Math.random() * 10) + 1;
45+
}
46+
47+
function confirmOrder(name) {
48+
return new Promise((resolve) => {
49+
const time = timeRandom();
50+
console.log(`* Confirmando ${name}, espere ${time} segundos.`);
51+
setTimeout(() => {
52+
console.log(`- '${name}', ha sido confirmado.\n`);
53+
resolve();
54+
}, time * 1000);
55+
});
56+
}
57+
58+
function prepareOrder(name) {
59+
return new Promise((resolve) => {
60+
const time = timeRandom();
61+
console.log(`* Preparando ${name}, espere ${time} segundos.`);
62+
setTimeout(() => {
63+
console.log(`- '${name}', está listo.\n`);
64+
resolve();
65+
}, time * 1000);
66+
});
67+
}
68+
69+
function servingOrder(name) {
70+
return new Promise((resolve) => {
71+
const time = timeRandom();
72+
console.log(`* Sirviendo ${name}, espere ${time} segundos.`);
73+
setTimeout(() => {
74+
console.log(`- '${name}', ha sido entregado.\n`);
75+
resolve();
76+
}, time * 1000);
77+
});
78+
}
79+
80+
async function processOrder(name) {
81+
console.log(`-----\n* Procesando: '${name}' \n-----\n`);
82+
await confirmOrder(name);
83+
await prepareOrder(name);
84+
await servingOrder(name);
85+
}
86+
87+
async function ordersList() {
88+
await processOrder("Baleadas");
89+
await processOrder("Tamales");
90+
await processOrder("Enchiladas");
91+
}
92+
93+
ordersList();
94+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
_____________________________________
3+
https://github.com/kenysdev
4+
2024 - JavaScript
5+
_______________________________________
6+
#22 FUNCIONES DE ORDEN SUPERIOR
7+
---------------------------------------
8+
 * EJERCICIO:
9+
 * Explora el concepto de funciones de orden superior en tu lenguaje
10+
 * creando ejemplos simples (a tu elección) que muestren su funcionamiento.
11+
 *
12+
 * DIFICULTAD EXTRA (opcional):
13+
 * Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
14+
 * lista de calificaciones), utiliza funciones de orden superior para
15+
 * realizar las siguientes operaciones de procesamiento y análisis:
16+
 * - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
17+
 *   y promedio de sus calificaciones.
18+
 * - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
19+
 *   que tienen calificaciones con un 9 o más de promedio.
20+
 * - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
21+
 * - Mayor calificación: Obtiene la calificación más alta de entre todas las
22+
 *   de los alumnos.
23+
 * - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
24+
*/
25+
// ________________________________________________________
26+
function arithmeticOp(func) {
27+
return function (x, y) {
28+
return func(x, y);
29+
};
30+
}
31+
32+
function add(x, y) {
33+
return x + y;
34+
}
35+
36+
function subtract(x, y) {
37+
return x - y;
38+
}
39+
40+
function multiply(x, y) {
41+
return x * y;
42+
}
43+
44+
const addition = arithmeticOp(add);
45+
const subtraction = arithmeticOp(subtract);
46+
const multiplication = arithmeticOp(multiply);
47+
48+
const rAddition = addition(2, 3);
49+
const rSubtraction = subtraction(10, 5);
50+
const rMultiplication = multiplication(2, 5);
51+
52+
console.log(`\n` +
53+
`Resultado de la suma: ${rAddition} \n` +
54+
`Resultado de la resta: ${rSubtraction} \n` +
55+
`Resultado de la multip.: ${rMultiplication}`);
56+
57+
// ________________________________________________________
58+
console.log("\n----\nDIFICULTAD EXTRA\n");
59+
60+
const studentsList = [
61+
{ name: "Ken", dob: "2012-04-21", grades: [9.5, 9.4, 9.3, 9.2] },
62+
{ name: "Ben", dob: "2012-03-20", grades: [8.5, 8.4, 8.3, 8.2] },
63+
{ name: "Ada", dob: "2012-02-19", grades: [7.5, 7.4, 7.3, 7.2] },
64+
{ name: "Zoe", dob: "2012-01-18", grades: [9.0, 9.1, 9.0, 9.1] },
65+
];
66+
67+
// Función de orden superior
68+
function higherOrderFun(msg, printFn) {
69+
return function (students) {
70+
console.log(`\n----\n${msg}`);
71+
students.forEach((student) => printFn(student));
72+
};
73+
}
74+
75+
function printGPA(student) {
76+
const grades = student.grades;
77+
const averageGrade = grades.reduce((sum, grade) => sum + grade, 0) / grades.length;
78+
console.log(`${student.name}: ${averageGrade.toFixed(2)}`);
79+
}
80+
81+
function printTop(student) {
82+
const grades = student.grades;
83+
const average = grades.reduce((sum, grade) => sum + grade, 0) / grades.length;
84+
if (average >= 9) console.log(student.name);
85+
}
86+
87+
function printBirth(student) {
88+
console.log(`${student.name}: ${student.dob}`);
89+
}
90+
91+
function printHighestGrade(student) {
92+
const maxGrade = Math.max(...student.grades);
93+
console.log(`${student.name}: ${maxGrade}`);
94+
}
95+
96+
const gradePointAverage = higherOrderFun("Promedio de calificaciones:", printGPA);
97+
const topStudents = higherOrderFun("Mejores estudiantes:", printTop);
98+
const birthOrder = higherOrderFun("Orden de nacimiento:", printBirth);
99+
const highestGrade = higherOrderFun("Mayor calificación:", printHighestGrade);
100+
101+
gradePointAverage(studentsList);
102+
topStudents(studentsList);
103+
birthOrder(
104+
[...studentsList].sort((a, b) => new Date(a.dob) - new Date(b.dob))
105+
);
106+
107+
highestGrade(studentsList);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
_____________________________________
3+
https://github.com/kenysdev
4+
2024 - JavaScript
5+
_______________________________________
6+
#23 PATRONES DE DISEÑO: SINGLETON
7+
---------------------------------------
8+
* EJERCICIO:
9+
 * Explora el patrón de diseño "singleton" y muestra cómo crearlo
10+
 * con un ejemplo genérico.
11+
 *
12+
 * DIFICULTAD EXTRA (opcional):
13+
 * Utiliza el patrón de diseño "singleton" para representar una clase que
14+
 * haga referencia a la sesión de usuario de una aplicación ficticia.
15+
 * La sesión debe permitir asignar un usuario (id, username, nombre y email),
16+
 * recuperar los datos del usuario y borrar los datos de la sesión.
17+
*/
18+
// ________________________________________________________
19+
20+
class Singleton {
21+
constructor() {
22+
if (Singleton.instance) {
23+
return Singleton.instance;
24+
}
25+
Singleton.instance = this;
26+
}
27+
}
28+
29+
const singleton1 = new Singleton();
30+
const singleton2 = new Singleton();
31+
32+
console.log(singleton1 === singleton2); // true
33+
34+
// ________________________________________________________
35+
console.log("\nDIFICULTAD EXTRA\n");
36+
37+
class UserSession {
38+
constructor() {
39+
if (UserSession.instance) {
40+
return UserSession.instance;
41+
}
42+
this.user = null;
43+
UserSession.instance = this;
44+
}
45+
46+
setUser(userId, username, name, email) {
47+
this.user = {
48+
id: userId,
49+
username,
50+
name,
51+
email,
52+
};
53+
}
54+
55+
getUser() {
56+
return this.user;
57+
}
58+
59+
logout() {
60+
this.user = null;
61+
}
62+
}
63+
64+
const session1 = new UserSession();
65+
session1.setUser(1, "Zoe_1", "Zoe", "[email protected]");
66+
console.log(session1.getUser());
67+
session1.logout();
68+
69+
const session2 = new UserSession();
70+
session2.setUser(2, "Ben_1", "Ben", "[email protected]");
71+
console.log(session2.getUser());
72+
session2.logout();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
_____________________________________
3+
https://github.com/kenysdev
4+
2024 - JavaScript
5+
_______________________________________
6+
#24 DECORADORES
7+
---------------------------------------
8+
 * EJERCICIO:
9+
 * Explora el concepto de "decorador" y muestra cómo crearlo
10+
 * con un ejemplo genérico.
11+
 *
12+
 * DIFICULTAD EXTRA (opcional):
13+
 * Crea un decorador que sea capaz de contabilizar cuántas veces
14+
 * se ha llamado a una función y aplícalo a una función de tu elección.
15+
*/
16+
// ________________________________________________________
17+
function myDecorator(func) {
18+
return function (...args) {
19+
console.log("\nAntes de que se llame a la función.");
20+
func(...args);
21+
console.log("Después de llamarla.");
22+
};
23+
}
24+
25+
function sayHello(firstName, lastName) {
26+
console.log(`Hola, ${firstName} ${lastName}!`);
27+
}
28+
29+
const decoratedSayHello = myDecorator(sayHello);
30+
decoratedSayHello("Zoe", "Roy");
31+
32+
console.log("\n______________________");
33+
function classDecorator(Class) {
34+
return class extends Class {
35+
greet() {
36+
console.log("\nAntes de llamar al método");
37+
super.greet();
38+
console.log("Después de llamar al método");
39+
}
40+
};
41+
}
42+
43+
// ________________________________________________________
44+
console.log("DIFICULTAD EXTRA");
45+
46+
function countCalls(func) {
47+
const wrapper = function (...args) {
48+
wrapper.calls++;
49+
func(...args);
50+
console.log(`Ha sido llamada ${wrapper.calls} veces.`);
51+
};
52+
wrapper.calls = 0;
53+
return wrapper;
54+
}
55+
56+
const functionA = countCalls(function (funcName) {
57+
console.log(`\nLa función '${funcName}':`);
58+
});
59+
60+
const functionB = countCalls(function (funcName, example) {
61+
console.log(`\nLa función ${funcName} - ${example}:`);
62+
});
63+
64+
functionA("A");
65+
functionA("A");
66+
functionA("A");
67+
68+
functionB("B", "args");
69+
functionB("B", "args");
70+

0 commit comments

Comments
 (0)