Skip to content

Commit 74291e7

Browse files
authored
Merge pull request mouredev#5901 from fborjalv/fborjalv-branch
#26 - Python
2 parents 9878f2c + f3510a0 commit 74291e7

File tree

3 files changed

+317
-0
lines changed

3 files changed

+317
-0
lines changed
+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
2+
3+
'''
4+
/*
5+
* EJERCICIO:
6+
* Explora el "Principio SOLID de Responsabilidad Única (Single Responsibility
7+
* Principle, SRP)" y crea un ejemplo simple donde se muestre su funcionamiento
8+
* de forma correcta e incorrecta.
9+
10+
11+
'''
12+
'''
13+
* DIFICULTAD EXTRA (opcional):
14+
* Desarrolla un sistema de gestión para una biblioteca. El sistema necesita
15+
* manejar diferentes aspectos como el registro de libros, la gestión de usuarios
16+
* y el procesamiento de préstamos de libros.
17+
* Requisitos:
18+
* 1. Registrar libros: El sistema debe permitir agregar nuevos libros con
19+
* información básica como título, autor y número de copias disponibles.
20+
* 2. Registrar usuarios: El sistema debe permitir agregar nuevos usuarios con
21+
* información básica como nombre, número de identificación y correo electrónico.
22+
* 3. Procesar préstamos de libros: El sistema debe permitir a los usuarios
23+
* tomar prestados y devolver libros.
24+
* Instrucciones:
25+
* 1. Diseña una clase que no cumple el SRP: Crea una clase Library que maneje
26+
* los tres aspectos mencionados anteriormente (registro de libros, registro de
27+
* usuarios y procesamiento de préstamos).
28+
* 2. Refactoriza el código: Separa las responsabilidades en diferentes clases
29+
* siguiendo el Principio de Responsabilidad Única.
30+
31+
'''
32+
33+
# Incorrecto
34+
35+
class Library:
36+
37+
books = []
38+
users = []
39+
loans = []
40+
41+
def new_book(self, author, title, n_copies):
42+
self.books.append({"author": author,
43+
"title": title,
44+
"n_copies": n_copies})
45+
46+
def new_user(self, name, id, email):
47+
self.users.append({"name": name,
48+
"id": id,
49+
"email": email})
50+
51+
def loan_book(self, user_id, book_title):
52+
for book in self.books:
53+
if book["title"] == book_title and book["n_copies"] > 0:
54+
self.loans.append({"user_id": user_id,
55+
"title_book": book_title})
56+
book["n_copies"] -=1
57+
58+
59+
def return_book(self, user_id, book_title):
60+
for loan in self.loans:
61+
if loan["user_id"] == user_id and loan["title_book"] == book_title:
62+
self.loans.remove(loan)
63+
for books in self.books:
64+
if books["title"] == book_title:
65+
books["n_copies"] += 1
66+
67+
68+
69+
70+
my_library = Library()
71+
my_library.new_book("Cervantes", "El quijote", 10)
72+
my_library.new_book("Rowling", "Harry Potter", 10)
73+
my_library.new_book("Tolkien", "El señor de los anillos", 20)
74+
75+
my_library.new_user("Brais", 105, "[email protected]")
76+
my_library.new_user("Borja", 120, "[email protected]")
77+
78+
print(my_library.books)
79+
print(my_library.users)
80+
81+
my_library.loan_book(120, "Harry Potter")
82+
print(my_library.loans)
83+
print(my_library.books)
84+
85+
my_library.return_book(120, "Harry Potter")
86+
print(my_library.books)
87+
88+
89+
90+
91+
# Correcto
92+
class Book:
93+
def __init__(self, title, author, n_copies):
94+
self.title = title
95+
self.author = author
96+
self.n_copies = n_copies
97+
98+
99+
class User:
100+
def __init__(self, name, id, email):
101+
self.name = name
102+
self.id = id
103+
self.email = email
104+
105+
class BookLoanProcesing:
106+
107+
def __init__(self):
108+
self.loans = []
109+
110+
def book_borrowing(self, book, user):
111+
if book.n_copies > 0:
112+
book.n_copies -= 1
113+
self.loans.append({"user_id": user.id,
114+
"title_book": book.title })
115+
else:
116+
print("No hay libros suficientes")
117+
118+
def book_returning(self, user, book):
119+
for loan in self.loans:
120+
if loan["user_id"] == user.id and loan["title_book"] == book.title:
121+
book.n_copies += 1
122+
self.loans.remove(loan)
123+
124+
125+
class Library():
126+
def __init__(self) -> None:
127+
self.books = []
128+
self.users = []
129+
self.loans = BookLoanProcesing()
130+
131+
def new_book(self, book):
132+
self.books.append(book)
133+
134+
def new_user(self, user):
135+
self.users.append(user)
136+
137+
def new_loan_book(self, user_id, title_book):
138+
user = next((user for user in self.users if user.id == user_id), None)
139+
book = next((book for book in self.books if book.title == title_book), None)
140+
if user and book:
141+
return self.loans.book_borrowing(user, book)
142+
143+
def return_book(self, user_id, title_book):
144+
user = next((user for user in self.user if user_id == user.id),None)
145+
book = next((book for book in self.books if book.title == title_book), None)
146+
if user and book:
147+
return self.loans.book_returning(user, book)
148+
149+
150+
+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
2+
"""
3+
4+
* EJERCICIO:
5+
* Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
6+
* y crea un ejemplo simple donde se muestre su funcionamiento
7+
* de forma correcta e incorrecta.
8+
"""
9+
10+
# Forma incorrecta
11+
12+
class Product():
13+
def __init__(self, name) -> None:
14+
self.name = name
15+
16+
def update_stock(self):
17+
if self.name == "zapatos":
18+
print("Actualizado el stock de zapatos")
19+
elif self.name == "camisas":
20+
print("Actualizado el stock de camisas")
21+
22+
# Forma correcta
23+
24+
from abc import ABC, abstractmethod
25+
26+
class Product(ABC):
27+
@abstractmethod
28+
def update_stock(self):
29+
pass
30+
31+
class Shoes(Product):
32+
33+
def update_stock(self):
34+
print("Actualizado el stock de zapatos")
35+
36+
class Shirts(Product):
37+
38+
def update_stock(self):
39+
print("Actualizado el stock de camisas")
40+
41+
42+
my_products = [Shoes(), Shirts()]
43+
44+
for i in my_products:
45+
i.update_stock()
46+
47+
"""
48+
* DIFICULTAD EXTRA (opcional):
49+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
50+
* Requisitos:
51+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
52+
* Instrucciones:
53+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
54+
* 2. Comprueba que el sistema funciona.
55+
* 3. Agrega una quinta operación para calcular potencias.
56+
* 4. Comprueba que se cumple el OCP.
57+
58+
"""
59+
from abc import ABC, abstractmethod
60+
61+
class Calculator(ABC):
62+
63+
@abstractmethod
64+
def calculate_operation(self, a, b):
65+
pass
66+
67+
class Sum(Calculator):
68+
69+
def calculate_operation(self, a, b):
70+
return a + b
71+
72+
class Subtract(Calculator):
73+
74+
def calculate_operation(self, a, b):
75+
return a - b
76+
77+
class Multiply(Calculator):
78+
79+
def calculate_operation(self, a, b):
80+
return a * b
81+
82+
class Division(Calculator):
83+
def calculate_operation(self, a, b):
84+
return a / b
85+
86+
class Pow(Calculator):
87+
88+
def calculate_operation(self, a, b):
89+
return a**b
90+
91+
92+
sum_op = Sum()
93+
substract_op = Subtract()
94+
multiply_op = Multiply()
95+
pow_op = Pow()
96+
division_op = Division()
97+
98+
print(sum_op.calculate_operation(4, 5))
99+
print(substract_op.calculate_operation(4,5))
100+
print(multiply_op.calculate_operation(4, 5))
101+
print(pow_op.calculate_operation(4,5))
102+
print(division_op.calculate_operation(4, 5))
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
* DIFICULTAD EXTRA (opcional):
3+
* Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
4+
* cumplir el LSP.
5+
* Instrucciones:
6+
* 1. Crea la clase Vehículo.
7+
* 2. Añade tres subclases de Vehículo.
8+
* 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
9+
* 4. Desarrolla un código que compruebe que se cumple el LSP.
10+
11+
"""
12+
13+
class Vehiculo:
14+
def __init__(self, velocidad=0) -> None:
15+
self.velocidad = velocidad
16+
17+
def acelera(self, aceleracion):
18+
self.velocidad += aceleracion
19+
print(f"Velocidad {self.velocidad}")
20+
21+
def frena(self, frenado):
22+
if self.velocidad <= 0:
23+
self.velocidad = 0
24+
self.velocidad -= frenado
25+
print(f"Velocidad {self.velocidad}")
26+
27+
28+
class Turismo(Vehiculo):
29+
def acelera(self, aceleracion):
30+
print("El turismo está acelerando")
31+
super().acelera(aceleracion)
32+
def frena(self, frenado):
33+
print("El turismo está frenando")
34+
super().frena(frenado)
35+
36+
class Furgoneta(Vehiculo):
37+
def acelera(self, aceleracion):
38+
print("La furgoneta está acelerando")
39+
super().acelera(aceleracion)
40+
def frena(self, frenado):
41+
print("La furgoneta está frenando")
42+
super().frena(frenado)
43+
44+
class Camion(Vehiculo):
45+
def acelera(self, aceleracion):
46+
print("El camión está acelerando")
47+
super().acelera(aceleracion)
48+
def frena(self, frenado):
49+
print("El camión está frenando")
50+
super().frena(frenado)
51+
52+
53+
def aplica_LSP(vehiculo):
54+
vehiculo.acelera(10)
55+
vehiculo.frena(5)
56+
57+
mi_vehiculo = Vehiculo()
58+
turismo = Turismo()
59+
furgoneta = Furgoneta()
60+
camion = Camion()
61+
62+
aplica_LSP(mi_vehiculo)
63+
aplica_LSP(turismo)
64+
aplica_LSP(furgoneta)
65+
aplica_LSP(camion)

0 commit comments

Comments
 (0)