|
| 1 | +''' |
| 2 | +/* |
| 3 | + * EJERCICIO: |
| 4 | + * Explora el "Principio SOLID de Responsabilidad Única (Single Responsibility |
| 5 | + * Principle, SRP)" y crea un ejemplo simple donde se muestre su funcionamiento |
| 6 | + * de forma correcta e incorrecta. |
| 7 | + * |
| 8 | + * DIFICULTAD EXTRA (opcional): |
| 9 | + * Desarrolla un sistema de gestión para una biblioteca. El sistema necesita |
| 10 | + * manejar diferentes aspectos como el registro de libros, la gestión de usuarios |
| 11 | + * y el procesamiento de préstamos de libros. |
| 12 | + * Requisitos: |
| 13 | + * 1. Registrar libros: El sistema debe permitir agregar nuevos libros con |
| 14 | + * información básica como título, autor y número de copias disponibles. |
| 15 | + * 2. Registrar usuarios: El sistema debe permitir agregar nuevos usuarios con |
| 16 | + * información básica como nombre, número de identificación y correo electrónico. |
| 17 | + * 3. Procesar préstamos de libros: El sistema debe permitir a los usuarios |
| 18 | + * tomar prestados y devolver libros. |
| 19 | + * Instrucciones: |
| 20 | + * 1. Diseña una clase que no cumple el SRP: Crea una clase Library que maneje |
| 21 | + * los tres aspectos mencionados anteriormente (registro de libros, registro de |
| 22 | + * usuarios y procesamiento de préstamos). |
| 23 | + * 2. Refactoriza el código: Separa las responsabilidades en diferentes clases |
| 24 | + * siguiendo el Principio de Responsabilidad Única. |
| 25 | + */ |
| 26 | +''' |
| 27 | + |
| 28 | +#El principio de SRP consiste en que una clase debe tener una única responsabilidad, es decir, una clase debe tener una única razón para cambiar. Si una clase tiene más de una responsabilidad, entonces la clase debe ser dividida en clases más pequeñas, cada una con una única responsabilidad. |
| 29 | + |
| 30 | +#Ejemplo incorrecto |
| 31 | +class Rectangulo: |
| 32 | + def __init__(self, ancho, alto): |
| 33 | + self.ancho = ancho |
| 34 | + self.alto = alto |
| 35 | + |
| 36 | + def calcular_area(self): |
| 37 | + return self.ancho * self.alto |
| 38 | + |
| 39 | + def dibujar(self): |
| 40 | + for i in range(self.alto): |
| 41 | + print('*' * self.ancho) |
| 42 | +#Es incorrecto porque la clase Rectangulo tiene dos responsabilidades: calcular el área y dibujar el rectángulo, por lo que no cumple con el principio SRP. |
| 43 | + |
| 44 | +#Ejemplo correcto |
| 45 | + |
| 46 | +class Rectangulo: |
| 47 | + def __init__(self, ancho, alto): |
| 48 | + self.ancho = ancho |
| 49 | + self.alto = alto |
| 50 | + |
| 51 | + def calcular_area(self): |
| 52 | + return self.ancho * self.alto |
| 53 | + |
| 54 | +class DibujarRectangulo: |
| 55 | + def __init__(self, rectangulo): |
| 56 | + self.rectangulo = rectangulo |
| 57 | + |
| 58 | + def dibujar(self): |
| 59 | + for i in range(self.rectangulo.alto): |
| 60 | + print('*' * self.rectangulo.ancho) |
| 61 | + |
| 62 | +#En este ejemplo, la clase Rectangulo tiene la responsabilidad de calcular el área, mientras que la clase DibujarRectangulo tiene la responsabilidad de dibujar el rectángulo. Cada clase tiene una única responsabilidad, por lo que cumple con el principio SRP. |
| 63 | + |
| 64 | +#Ejemplo de sistema de gestión de biblioteca incorrecto |
| 65 | + |
| 66 | +class Library: |
| 67 | + def __init__(self): |
| 68 | + self.libros = [] |
| 69 | + self.usuarios = [] |
| 70 | + self.prestamos = [] |
| 71 | + |
| 72 | + def agregar_libro(self, libro): |
| 73 | + self.libros.append(libro) |
| 74 | + |
| 75 | + def agregar_usuario(self, usuario): |
| 76 | + self.usuarios.append(usuario) |
| 77 | + |
| 78 | + def prestar_libro(self, libro, usuario, fecha_prestamo, fecha_devolucion): |
| 79 | + prestamo = (libro, usuario, fecha_prestamo, fecha_devolucion) |
| 80 | + self.prestamos.append(prestamo) |
| 81 | + |
| 82 | + def devolver_libro(self, prestamo): |
| 83 | + self.prestamos.remove(prestamo) |
| 84 | + |
| 85 | +#Es incorrecto porque la clase Library tiene tres responsabilidades: registrar libros, registrar usuarios y procesar préstamos de libros, por lo que no cumple con el principio SRP. |
| 86 | + |
| 87 | +#Ejemplo de sistema de gestión de biblioteca corecto |
| 88 | + |
| 89 | +class Library: |
| 90 | + def __init__(self, titulo, autor, copias_disponibles): |
| 91 | + self.titulo = titulo |
| 92 | + self.autor = autor |
| 93 | + self.copias_disponibles = copias_disponibles |
| 94 | + |
| 95 | +class Usuario: |
| 96 | + def __init__(self, nombre, identificacion, correo): |
| 97 | + self.nombre = nombre |
| 98 | + self.identificacion = identificacion |
| 99 | + self.correo = correo |
| 100 | + |
| 101 | +class Prestamo: |
| 102 | + def __init__(self, libro, usuario, fecha_prestamo, fecha_devolucion): |
| 103 | + self.libro = libro |
| 104 | + self.usuario = usuario |
| 105 | + self.fecha_prestamo = fecha_prestamo |
| 106 | + self.fecha_devolucion = fecha_devolucion |
| 107 | + |
| 108 | +class RegistroLibros: |
| 109 | + def __init__(self): |
| 110 | + self.libros = [] |
| 111 | + |
| 112 | + def agregar_libro(self, libro): |
| 113 | + self.libros.append(libro) |
| 114 | + |
| 115 | +class RegistroUsuarios: |
| 116 | + def __init__(self): |
| 117 | + self.usuarios = [] |
| 118 | + |
| 119 | + def agregar_usuario(self, usuario): |
| 120 | + self.usuarios.append(usuario) |
| 121 | + |
| 122 | +class ProcesarPrestamos: |
| 123 | + def __init__(self): |
| 124 | + self.prestamos = [] |
| 125 | + |
| 126 | + def prestar_libro(self, libro, usuario, fecha_prestamo, fecha_devolucion): |
| 127 | + prestamo = Prestamo(libro, usuario, fecha_prestamo, fecha_devolucion) |
| 128 | + self.prestamos.append(prestamo) |
| 129 | + |
| 130 | + def devolver_libro(self, prestamo): |
| 131 | + self.prestamos.remove(prestamo) |
| 132 | + |
| 133 | +#En este ejemplo, se han creado diferentes clases para manejar las responsabilidades de registrar libros, registrar usuarios y procesar préstamos de libros. Cada clase tiene una única responsabilidad, por lo que cumple con el principio SRP. |
0 commit comments