diff --git a/Roadmap/26 - SOLID SRP/javascript/pedamoci.js b/Roadmap/26 - SOLID SRP/javascript/pedamoci.js new file mode 100644 index 0000000000..e709b0a617 --- /dev/null +++ b/Roadmap/26 - SOLID SRP/javascript/pedamoci.js @@ -0,0 +1,228 @@ +// SRP MAL HECHO +class WrongSRP { + sumar(num1, num2) { + console.log(num1 + num2) + } + + dateNow() { + const date = new Date + console.log(date.toDateString()) + } +} + +const wrongSRP = new WrongSRP +wrongSRP.sumar(45, 321) +wrongSRP.dateNow() + +// SRP BIEN HECHO +class SumarSRP { + sumar(num1, num2) { + console.log(num1 + num2) + } +} + +class DateNowSRP { + dateNow() { + const date = new Date + console.log(date.toDateString()) + } +} + +const sumarSRP = new SumarSRP +sumarSRP.sumar(56, 987) + +const dateNowSRP = new DateNowSRP +dateNowSRP.dateNow() + +// ------------------------------------------------ DIFICULTAD EXTRA ------------------------------------------------ +class ManagementLibrary { + constructor() { + this.books = new Map() + this.users = new Map() + this.loans = [] + } + + addBook(title, writer, numberCopies) { + if (this.books.has(title)) console.warn('El libro que desea agregar ya está en la biblioteca') + else { + this.books.set(title, {writer: writer, copies: numberCopies}) + console.log('El libro se ha agregado al catálogo de la biblioteca') + } + } + + addUser(idUser, name, number) { + if (this.users.has(idUser)) console.warn('El usuario ya está registrado en la biblioteca') + else { + this.users.set(idUser, {name: name, number: number}) + console.log('El usuario se ha registrado correctamente en la biblioteca') + } + } + + loanBook(title, idUser) { + if (!this.books.has(title)) return console.warn('El libro que desea no está en esta biblioteca') + if (!this.users.has(idUser)) return console.warn('El usuario no esta registrado en esta biblioteca') + const book = this.books.get(title) + if (book.copies > 0) { + this.loans.push([idUser, title]) + book.copies-- + console.log('Recuerda devolver el libro cuando lo termines, gracias!') + } else { + console.warn('No quedan existencias del libro que desea\nPregunte nuevamente en otro momento o elija otro') + } + } + + returnBook(title, idUser) { + if (this.books.has(title) && this.users.has(idUser)) { + let booksLoanedUser = this.loans.filter((loan) => loan[0] === idUser) // devuelde los libros retirados por el usuario + if (booksLoanedUser.length > 0 && booksLoanedUser.map((loan) => loan[1] === title)) { // verifica que haya libros retirado por el usuario y que coincida con el titulo ingresado + let index = this.loans.findIndex((loan) => {return loan[0] === idUser && loan[1] === title}) // devuelve el index del array donde esta el libro retirado y el id del usuario + this.loans.splice(index, 1) + const book = this.books.get(title) + book.copies++ + console.log('Has devuelto el libro!! Gracias!!') + } else console.warn('Id o titulo del libro incorrectos') + } + else { + console.error('Datos incorrectos, vuelve a chequear que escribiste bien el nombre del libro o tu id') + } + } +} + +const library = new ManagementLibrary() + +//Creación de libros +console.log('----------------- CREACION DE LIBROS -----------------') +library.addBook('Cien años de soledad', 'Gabriel García Márquez', 5); library.addBook('1984', 'George Orwell', 7); library.addBook('Orgullo y Prejuicio', 'Jane Austen', 3); library.addBook('El Principito', 'Antoine de Saint-Exupéry', 10); library.addBook('Don Quijote de la Mancha', 'Miguel de Cervantes', 2); library.addBook('Crimen y Castigo', 'Fiódor Dostoievski', 4); library.addBook('Moby Dick', 'Herman Melville', 6); library.addBook('Ensayo sobre la ceguera', 'José Saramago', 8) + +//Creación de usuarios +console.log('\n----------------- CREACION DE USUARIOS -----------------') +library.addUser(10001, 'Martina López', 987654321); library.addUser(10002, 'Javier Ríos', 912345678); library.addUser(10003, 'Sofía Giménez', 900112233); library.addUser(10004, 'Andrés Castro', 945612378); library.addUser(10005, 'Valeria Torres', 998877665); library.addUser(10006, 'Ricardo Paz', 965432101); library.addUser(10007, 'Elena Ruiz', 955544433); library.addUser(10008, 'Felipe Díaz', 933322211); library.addUser(10009, 'Carla Méndez', 977788899); library.addUser(10010, 'Pablo Núñez', 921234567); library.addUser(10011, 'Luisa Vargas', 987123456); library.addUser(10012, 'Diego Soto', 911223344); library.addUser(10013, 'Catalina Vega', 950505050); library.addUser(10014, 'Hugo Ferrer', 930303030); library.addUser(10015, 'Micaela Gil', 970707070) + +// Creación de prestamos + console.log('\n----------------- CREACION DE PRESTAMOS -----------------') + // AGOTANDO EXISTENCIAS: 'Don Quijote de la Mancha' y 'Orgullo y Prejuicio' + library.loanBook('Don Quijote de la Mancha', 10001); library.loanBook('Don Quijote de la Mancha', 10002) + library.loanBook('Orgullo y Prejuicio', 10003); library.loanBook('Orgullo y Prejuicio', 10004); library.loanBook('Orgullo y Prejuicio', 10005) + + // PETICIONES EXITOSAS + library.loanBook('1984', 10006); library.loanBook('Cien años de soledad', 10007); library.loanBook('Ensayo sobre la ceguera', 10008); library.loanBook('Moby Dick', 10009); library.loanBook('Crimen y Castigo', 10010) + + // PETICIONES FALLIDAS + console.log('\n----------------- CREACION DE PRESTAMOS ERRONEOS -----------------') + //Libros agotados + library.loanBook('Don Quijote de la Mancha', 10011); library.loanBook('Orgullo y Prejuicio', 10012) + //Libros inexistentes + library.loanBook('El Código Da Vinci', 10013); library.loanBook('Frieren', 10014) + +// Creación de devoluciones + // Devoluciones exitosas + console.log('\n----------------- CREACION DE DEVOLUCIONES -----------------') + library.returnBook('Don Quijote de la Mancha', 10001); library.returnBook('Orgullo y Prejuicio', 10005); library.returnBook('1984', 10006); library.returnBook('Cien años de soledad', 10007); library.returnBook('Moby Dick', 10009) + + // Devolución con ID de usuario incorrecto (posiblemente fallida) + console.log('\n----------------- CREACION DE DEVOLUCIONES ERRONEAS -----------------') + library.returnBook('Crimen y Castigo', 32465) + + + +// ---------------------------------------------------------------- REFACTORIZACION ---------------------------------------------------------------- +class AddBook { + constructor() { + this.books = new Map() + } + + addBook(title, writer, numberCopies) { + if (this.books.has(title)) console.warn('El libro que desea agregar ya está en la biblioteca') + else { + this.books.set(title, {writer: writer, copies: numberCopies}) + console.log('El libro se ha agregado al catálogo de la biblioteca') + } + } +} + +class AddUser { + constructor() { + this.users = new Map() + } + + addUser(idUser, name, number) { + if (this.users.has(idUser)) console.warn('El usuario ya está registrado en la biblioteca') + else { + this.users.set(idUser, {name: name, number: number}) + console.log('El usuario se ha registrado correctamente en la biblioteca') + } + } +} + +class Loans { + constructor() { + this.loans = [] + } + + loanBook(title, idUser) { + if (!inventory.books.has(title)) return console.warn('El libro que desea no está en esta biblioteca') + if (!clients.users.has(idUser)) return console.warn('El usuario no esta registrado en esta biblioteca') + const book = inventory.books.get(title) + if (book.copies > 0) { + this.loans.push([idUser, title]) + book.copies-- + console.log('Recuerda devolver el libro cuando lo termines, gracias!') + } + else { + console.warn('No quedan existencias del libro que desea\nPregunte nuevamente en otro momento o elija otro') + } + } + + returnBook(title, idUser) { + if (inventory.books.has(title) && clients.users.has(idUser)) { + let booksLoanedUser = this.loans.filter((loan) => loan[0] === idUser) // devuelde los libros retirados por el usuario + if (booksLoanedUser.length > 0 && booksLoanedUser.map((loan) => loan[1] === title)) { // verifica que haya libros retirado por el usuario y que coincida con el titulo ingresado + let index = this.loans.findIndex((loan) => {return loan[0] === idUser && loan[1] === title}) // devuelve el index del array donde esta el libro retirado y el id del usuario + this.loans.splice(index, 1) + const book = inventory.books.get(title) + book.copies++ + console.log('Has devuelto el libro!! Gracias!!') + } else console.warn('Id o titulo del libro incorrectos') + } + else { + console.error('Datos incorrectos, vuelve a chequear que escribiste bien el nombre del libro o tu id') + } + } +} + +const inventory = new AddBook() +const clients = new AddUser() +const loans = new Loans() + +//Creación de libros +console.log('----------------- CREACION DE LIBROS -----------------') +inventory.addBook('Cien años de soledad', 'Gabriel García Márquez', 5); inventory.addBook('1984', 'George Orwell', 7); inventory.addBook('Orgullo y Prejuicio', 'Jane Austen', 3); inventory.addBook('El Principito', 'Antoine de Saint-Exupéry', 10); inventory.addBook('Don Quijote de la Mancha', 'Miguel de Cervantes', 2); inventory.addBook('Crimen y Castigo', 'Fiódor Dostoievski', 4); inventory.addBook('Moby Dick', 'Herman Melville', 6); inventory.addBook('Ensayo sobre la ceguera', 'José Saramago', 8) + +//Creación de usuarios +console.log('\n----------------- CREACION DE USUARIOS -----------------') +clients.addUser(10001, 'Martina López', 987654321); clients.addUser(10002, 'Javier Ríos', 912345678); clients.addUser(10003, 'Sofía Giménez', 900112233); clients.addUser(10004, 'Andrés Castro', 945612378); clients.addUser(10005, 'Valeria Torres', 998877665); clients.addUser(10006, 'Ricardo Paz', 965432101); clients.addUser(10007, 'Elena Ruiz', 955544433); clients.addUser(10008, 'Felipe Díaz', 933322211); clients.addUser(10009, 'Carla Méndez', 977788899); clients.addUser(10010, 'Pablo Núñez', 921234567); clients.addUser(10011, 'Luisa Vargas', 987123456); clients.addUser(10012, 'Diego Soto', 911223344); clients.addUser(10013, 'Catalina Vega', 950505050); clients.addUser(10014, 'Hugo Ferrer', 930303030); clients.addUser(10015, 'Micaela Gil', 970707070) + +// Creación de prestamos + console.log('\n----------------- CREACION DE PRESTAMOS -----------------') + // AGOTANDO EXISTENCIAS: 'Don Quijote de la Mancha' y 'Orgullo y Prejuicio' + loans.loanBook('Don Quijote de la Mancha', 10001); loans.loanBook('Don Quijote de la Mancha', 10002) + loans.loanBook('Orgullo y Prejuicio', 10003); loans.loanBook('Orgullo y Prejuicio', 10004); loans.loanBook('Orgullo y Prejuicio', 10005) + + // PETICIONES EXITOSAS + loans.loanBook('1984', 10006); loans.loanBook('Cien años de soledad', 10007); loans.loanBook('Ensayo sobre la ceguera', 10008); loans.loanBook('Moby Dick', 10009); loans.loanBook('Crimen y Castigo', 10010) + + // PETICIONES FALLIDAS + console.log('\n----------------- CREACION DE PRESTAMOS ERRONEOS -----------------') + //Libros agotados + loans.loanBook('Don Quijote de la Mancha', 10011); loans.loanBook('Orgullo y Prejuicio', 10012) + //Libros inexistentes + loans.loanBook('El Código Da Vinci', 10013); loans.loanBook('Frieren', 10014) + +// Creación de devoluciones + // Devoluciones exitosas + console.log('\n----------------- CREACION DE DEVOLUCIONES -----------------') + loans.returnBook('Don Quijote de la Mancha', 10001); loans.returnBook('Orgullo y Prejuicio', 10005); loans.returnBook('1984', 10006); loans.returnBook('Cien años de soledad', 10007); loans.returnBook('Moby Dick', 10009) + + // Devolución con ID de usuario incorrecto (posiblemente fallida) + console.log('\n----------------- CREACION DE DEVOLUCIONES ERRONEAS -----------------') + loans.returnBook('Crimen y Castigo', 32465) \ No newline at end of file diff --git a/Roadmap/27 - SOLID OCP/javascript/pedamoci.js b/Roadmap/27 - SOLID OCP/javascript/pedamoci.js new file mode 100644 index 0000000000..6b2bc82500 --- /dev/null +++ b/Roadmap/27 - SOLID OCP/javascript/pedamoci.js @@ -0,0 +1,150 @@ +// OCP MAL HECHO + class DateNow { + getDateNow(info) { + const date = new Date + switch (info) { + case 'day': + console.log(`El día es: ${date.getDay()}`) + break; + case 'month': + console.log(`El mes es: ${date.getMonth()}`) + break; + default: + break; + } + } + } + console.log('------------- OCP MAL HECHO -------------') + const dateNow = new DateNow + dateNow.getDateNow('day') + dateNow.getDateNow('month') + + // Si necesito agregar una función tengo que modificar el switch + + class DateNow2 { + getDateNow(info) { + const date = new Date + switch (info) { + case 'day': + console.log(`El día es: ${date.getDay()}`) + break; + case 'month': + console.log(`El mes es: ${date.getMonth()}`) + break; + case 'year': + console.log(`El año es: ${date.getFullYear()}`) + break; + default: + break; + } + } + } + + const dateNow2 = new DateNow2 + dateNow2.getDateNow('day') + dateNow2.getDateNow('month') + dateNow2.getDateNow('year') + +// OCP BIEN HECHO +class DateNow3 { + constructor(getDate) { + this.getDate = getDate + } + + getDateNow() { + return this.getDate.getDateNow() + } +} + +class GetDateNow { + getDateNow() {} +} + +class GetDay extends GetDateNow{ + getDateNow() { + const date = new Date + return date.getDay() + } +} + +class GetMonth extends GetDateNow{ + getDateNow() { + const date = new Date + return date.getMonth() + } +} + +console.log('\n------------- OCP BIEN HECHO -------------') +const getDay = new DateNow3(new GetDay()) +console.log(`El día es: ${getDay.getDateNow()}`) +const getMonth = new DateNow3(new GetMonth()) +console.log(`El mes es: ${getMonth.getDateNow()}`) + +// Si quiero agregar una función +class GetYear extends GetDateNow { + getDateNow() { + const date = new Date + return date.getFullYear() + } +} + +const getYear = new DateNow3(new GetYear()) +console.log(`El año es: ${getYear.getDateNow()}`) + +// -------------------------------------------------- EJERCICIO EXTRA -------------------------------------------------- +class Calculator { + constructor(calculation) { + this.calculation = calculation + } + + operation(num1, num2) { + return this.calculation.operation(num1, num2) + } +} + +class Operations { + operation() {} +} + +class Addition extends Operations{ + operation(num1, num2) { + return num1 + num2 + } +} + +class Subtraction extends Operations{ + operation(num1, num2) { + return num1 - num2 + } +} + +class Division extends Operations{ + operation(num1, num2) { + if (num2 === 0) return 'No se puede dividir por cero' + return num1 / num2 + } +} + +// Comprobación de que el sistema funciona +console.log('\n--------------- COMPROBACION DE FUNCIONAMIENTO ---------------') +const addition = new Calculator(new Addition()) +console.log(`Suma: ${addition.operation(55, 32)}`) + +const subtraction = new Calculator(new Subtraction()) +console.log(`Resta: ${subtraction.operation(55, 32)}`) + +const division = new Calculator(new Division()) +console.log(`Divición: ${division.operation(55, 5)}`) + +class Exponentiation extends Operations{ + operation(num1, num2) { + return num1 ** num2 + } +} + +console.log('\n--------------- COMPROBACION DE FUNCIONAMIENTO FINAL ---------------') +const exponentiation = new Calculator(new Exponentiation()) +console.log(`Suma: ${addition.operation(5465, 3245)}`) +console.log(`Resta: ${subtraction.operation(35480, 54982)}`) +console.log(`Divición: ${division.operation(8464, 154)}`) +console.log(`Exponenciación: ${exponentiation.operation(55, 4)}`) \ No newline at end of file diff --git a/Roadmap/28 - SOLID LSP/javascript/pedamoci.js b/Roadmap/28 - SOLID LSP/javascript/pedamoci.js new file mode 100644 index 0000000000..ad2fc396f1 --- /dev/null +++ b/Roadmap/28 - SOLID LSP/javascript/pedamoci.js @@ -0,0 +1,142 @@ +// LSP MAL HECHO +class WrongPersona { + constructor(idCard, name, lastName, card) { + this.idCard = idCard + this.name = name + this.lastName = lastName + this.card = card + } + + pagar(price) { + console.log(`Se ha usado para pagar $${price} la tarjeta ${this.card}`) + } +} + +const wrongAdulto = new WrongPersona(84987, 'Raul', 'Hectorio', 762456342464) +wrongAdulto.pagar(543) + +// No cumple con el LSP ya que si queremos asignar un niño a persona tenemos que poner valores nulos y estonces un niño no cumpliria con lo de persona +const wrongNiño = new WrongPersona(null, 'Caterina', 'Escamilla', null) + + +// LSP BIEN HECHO +class Persona { + constructor(name, lastName) { + this.name = name + this.lastName = lastName + } +} + +class Adulto extends Persona { + constructor(name, lastName, idCard, card) { + super(name, lastName) + this.idCard = idCard + this.card = card + } + + pagar(price) { + console.log(`Se ha usado para pagar $${price} la tarjeta ${this.card}`) + } +} + +class Niño extends Persona { + constructor(name, lastName) { + super(name, lastName) + } +} + +const adulto = new Adulto(84987, 'Raul', 'Hectorio', 762456342464) +adulto.pagar(543) +const niño = new Niño('Caterina', 'Escamilla') + +// ------------------------------------------------- DIFICULTAD EXTRA ------------------------------------------------- +class Vehicle { + constructor(acceleration, deceleration) { + this.acceleration = acceleration + this.deceleration = deceleration + this.speed = 0 + } + + accelerate(targetSpeed) { + if (this.speed >= targetSpeed) return Promise.reject('ERROR ingresaste una velocidad igual o menor a la actual') + const startTime = performance.now() + return new Promise(resolve => { + setTimeout(() => { + this.speed = targetSpeed + const endTime = performance.now() + console.log(`Tardo en acelerar hasta ${targetSpeed}km/h ${((endTime - startTime)/1000).toFixed(2)}s`) + resolve() + }, 1000 * ((targetSpeed - this.speed)/this.acceleration)) + }) + } + + decelerate(targetSpeed) { + if (this.speed <= targetSpeed) return Promise.reject('ERROR ingresaste una velocidad igual o menor a la actual') + const startTime = performance.now() + return new Promise(resolve => { + setTimeout(() => { + this.speed = targetSpeed + const endTime = performance.now() + console.log(`Tardo en desacelerar hasta ${targetSpeed}km/h ${((endTime - startTime)/1000).toFixed(2)}s`) + resolve() + }, (targetSpeed === 0) ? 1000 * (this.speed/this.deceleration) + : 1000 * (targetSpeed/this.deceleration)) + }) + } +} + +class Bicycle extends Vehicle{ + constructor(acceleration, deceleration) { + super(acceleration, deceleration) + } + + tocarBocina() { + console.log('¡Ting ting!') + } +} + +class Car extends Vehicle{ + constructor(acceleration, deceleration) { + super(acceleration, deceleration) + } + + ponerGuiño(direction) { + if (direction === 'derecha') console.log('→') + if (direction === 'izquierda') console.log('←') + } +} + +class Plane extends Vehicle{ + constructor(acceleration, deceleration) { + super(acceleration, deceleration) + } + + notificarPorAltavoz() { + console.log('Señores pasajeros tengan la amabilidad de abrocharse el cinturon') + } +} + +async function program() { + const bicycle = new Bicycle(10, 5) + const car = new Car(100, 50) + const plane = new Plane(400, 150) + + plane.notificarPorAltavoz() + + await Promise.all([ + plane.accelerate(2500), + car.accelerate(120), + bicycle.accelerate(30) + ]) + + await plane.accelerate(4000) + + car.ponerGuiño('derecha') + await car.decelerate(80) + car.ponerGuiño('izquierda') + + await bicycle.decelerate(0) + bicycle.tocarBocina() +} + +program() \ No newline at end of file diff --git a/Roadmap/29 - SOLID ISP/javascript/pedamoci.js b/Roadmap/29 - SOLID ISP/javascript/pedamoci.js new file mode 100644 index 0000000000..93c9449532 --- /dev/null +++ b/Roadmap/29 - SOLID ISP/javascript/pedamoci.js @@ -0,0 +1,209 @@ +console.log('---------------------- ISP MAL HECHO ----------------------') +class WrongAnimal { + eat() { + console.log('Comiendo') + } + run() { + console.log('Corriendo') + } +} + +class WrongDog extends WrongAnimal {} + +class WrongFish extends WrongAnimal { + run() { + try { + throw new Error("Un pez no puede correr") + } catch (e) { + console.log(e.message) + } + } +} + +const wrongDog = new WrongDog +const wrongFish = new WrongFish + +wrongDog.eat() +wrongDog.run() + +wrongFish.eat() +wrongFish.run() + +console.log('\n---------------------- ISP BIEN HECHO ----------------------') +const canEat = { + eat() { console.log('Comiendo') } +} + +const canRun = { + run() { console.log('Corriendo') } +} + +class Dog { + constructor() { + Object.assign(this, canEat, canRun) + } +} + +class Fish { + constructor() { + Object.assign(this, canEat) + } +} + +const dog = new Dog +const fish = new Fish + +dog.eat() +dog.run() + +fish.eat() + +// ------------------------------------------ DIFICULTAD EXTRA ------------------------------------------ +const colors = { + ROJO: "\x1b[31m", + VERDE: "\x1b[32m", + AMARILLO: "\x1b[33m", + AZUL: "\x1b[34m", + MAGENTA: "\x1b[35m", + CIAN: "\x1b[36m", + RESET: "\x1b[0m" +} + +const printWhiteBlack = { + print(text) { + console.log('Imprimiendo...') + return new Promise(resolve => { + setTimeout(() => { + console.log(text) + resolve() + }, 1500); + }) + } +} + +const printColor = { + print(text, color) { + console.log('Imprimiendo...') + return new Promise(resolve => { + setTimeout(() => { + switch (color) { + case 'rojo': + console.log(`${colors.ROJO}${text}${colors.RESET}`) + resolve() + break + case 'verde': + console.log(`${colors.VERDE}${text}${colors.RESET}`) + resolve() + break + case 'amarillo': + console.log(`${colors.AMARILLO}${text}${colors.RESET}`) + resolve() + break + case 'azul': + console.log(`${colors.AZUL}${text}${colors.RESET}`) + resolve() + break + case 'magenta': + console.log(`${colors.MAGENTA}${text}${colors.RESET}`) + resolve() + break + case 'cian': + console.log(`${colors.CIAN}${text}${colors.RESET}`) + resolve() + break + default: console.warn('Ese color no esta disponible') + resolve() + break + } + }, 1500); + }) + } +} + +const hasScan = { + scan() { + console.log('Escaneando...') + return new Promise(resolve => { + setTimeout(() => { + this.text = 'EJERCICIO:\n' + + 'Explora el "Principio SOLID de Segregación de Interfaces\n' + + '(Interface Segregation Principle, ISP)", y crea un ejemplo\n' + + 'simple donde se muestre su funcionamiento de forma correcta e incorrecta.\n' + + + '\nDIFICULTAD EXTRA (opcional):\n' + + 'Crea un gestor de impresoras.\n' + + 'Requisitos:\n' + + '1. Algunas impresoras sólo imprimen en blanco y negro.\n' + + '2. Otras sólo a color.\n' + + '3. Otras son multifunción, pueden imprimir, escanear y enviar fax.\n' + + 'Instrucciones:\n' + + '1. Implementa el sistema, con los diferentes tipos de impresoras y funciones.\n' + + '2. Aplica el ISP a la implementación.\n' + + '3. Desarrolla un código que compruebe que se cumple el principio.' + console.log('El scaneo a terminado') + resolve() + }, 2500) + }) + } +} + +const hasFax = { + sendFax() { + console.log('Enviando...') + return new Promise(resolve => { + setTimeout(() => { + console.log('Se ha emviado el fax') + resolve() + }, 4000); + }) + } +} + +class PrinterWhiteBlack { + constructor() { + Object.assign(this, printWhiteBlack) + } +} + +class PrinterColor { + constructor() { + Object.assign(this, printColor) + } +} + +class PrinterWhiteBlackScanFax { + constructor() { + Object.assign(this, printWhiteBlack, hasScan, hasFax) + this.text = '' + } +} + +class PrinterColorScanFax { + constructor() { + Object.assign(this, printColor, hasScan, hasFax) + this.text = '' + } +} + +const printerWhiteBlack = new PrinterWhiteBlack + +const printerColor = new PrinterColor + +const printerWhiteBlackScanFax = new PrinterWhiteBlackScanFax + +const printerColorScanFax = new PrinterColorScanFax + +async function program() { + console.log('voy a escanear un texto con printerColorScanFax') + await printerColorScanFax.scan() + + console.log('voy a enviar un fax con printerWhiteBlackScanFax') + await printerWhiteBlackScanFax.sendFax('Te mando este fax desde una impresora que solo imprime en blanco y negro') + + console.log('voy a imprimir con printColor y printWhiteBlack') + await Promise.all([printColor.print('imprimiendo en color cian', 'cian'), printWhiteBlack.print('imprimiendo en blanco y negro')]) + + console.log('voy a imprimir el texto escaneado con printerColorScanFax') + await printerColorScanFax.print(printerColorScanFax.text, 'magenta') +} +program() \ No newline at end of file diff --git a/Roadmap/30 - SOLID DIP/javascript/pedamoci.js b/Roadmap/30 - SOLID DIP/javascript/pedamoci.js new file mode 100644 index 0000000000..8d124a51e3 --- /dev/null +++ b/Roadmap/30 - SOLID DIP/javascript/pedamoci.js @@ -0,0 +1,142 @@ +// ----------------------- DIP MAL HECHO ----------------------- +class MongoDB { + save(data) { + // Aca iria la logica para guardar los datos n la base de datos MongoDB + } +} + +class WrongPrograma { + constructor() { + this.database = new MongoDB() + } + + saveUser(user) { + this.database.save(user) + } +} + +const wrongProgram = new WrongPrograma() + +class MySQL { + save(data) { + // Aca iria la logica para guardar los datos n la base de datos MySQL + } +} + +/* --> Si quisieras cambiar la base de datos necesitaias re escribir el programa principal <-- */ +class NewWrongPrograma { + constructor() { + this.database = new MySQL() + } + + saveUser(user) { + this.database.save(user) + } +} + + +// ----------------------- DIP BIEN HECHO ----------------------- +class DataRepository { + save(data) { + throw new Error("Este metodo deberia estar sobreescrito por las subclases"); + } +} +class PostgreeSQL extends DataRepository { + save(data) { + // Aca iria la logica para guardar los datos n la base de datos PostgreeSQL + } +} + +class Oracle extends DataRepository { + save(data) { + // Aca iria la logica para guardar los datos n la base de datos Oracle + } +} + +class Programa { + constructor(database) { + this.database = database + } + + saveUser(user) { + this.database.save(user) + } +} + +const postgreeSQL = new PostgreeSQL +const programa = new Programa(postgreeSQL) +/* --> Si quisieras cambiar la base de datos necesitaias pasarsela como parametro al programa principal <-- */ +const oracle = new Oracle +programa.database = oracle + +// --------------------------------- DIFICULTAD EXTRA --------------------------------- +class ServiceMessage { + send(msg) { + throw new Error("Este metodo deberia estar sobreescrito por las subclases"); + } +} + +class Email extends ServiceMessage { + send(msg) { + console.log('Enviando el email...') + return new Promise(resolve => { + setTimeout(() => { + console.log(`Se ha enviado: ${msg}`) + resolve() + }, 500); + }) + } +} + +class Push extends ServiceMessage { + send(msg) { + console.log('Enviando el push...') + return new Promise(resolve => { + setTimeout(() => { + console.log(`Se ha enviado: ${msg}`) + resolve() + }, 500); + }) + } +} + +class Sms extends ServiceMessage { + send(msg) { + console.log('Enviando el sms...') + return new Promise(resolve => { + setTimeout(() => { + console.log(`Se ha enviado: ${msg}`) + resolve() + }, 500); + }) + } +} + +class Program { + constructor(msgService) { + this.msgService = msgService + } + + async notify(msg) { + await this.msgService.send(msg) + } +} + +const email = new Email() +const push = new Push() +const sms = new Sms() +const program = new Program(email) + +async function tester() { + console.log('\nEl testeo ha iniciado enviando el primer mensaje por email') + await program.notify('Enviando un mensaje por email') + + console.log('\nCambiando el servicio de mensajeria a sms') + program.msgService = sms + await program.notify('Enviando un mensaje por sms') + + console.log('\nCambiando el servicio de mensajeria a push') + program.msgService = push + await program.notify('Enviando un mensaje por push') +} +tester() \ No newline at end of file