Skip to content

Commit 4a0e8e9

Browse files
authored
Merge pull request mouredev#4604 from LuisOlivaresJ/main
#26-Python
2 parents 8aea4bf + 8a6ea8a commit 4a0e8e9

File tree

1 file changed

+298
-0
lines changed

1 file changed

+298
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
# ---------------------------------------------
2+
# Ejemplo de Principio de responsabilidad única
3+
# ---------------------------------------------
4+
5+
# El siguiente ejemplo muestra un código que viola el principio de responsabilidad única.
6+
# La clase ImageManager tiene dos responsabilidades:
7+
# 1.- Obtener estadísticas de una imagen
8+
# 2.- Graficar una imagen
9+
10+
import matplotlib.pyplot as plt
11+
import numpy as np
12+
13+
import logging
14+
15+
16+
class ImageManager:
17+
def __init__(self, array):
18+
self.array = array
19+
20+
def get_statistics(self):
21+
return {
22+
"mean": np.mean(self.array),
23+
"std": np.std(self.array),
24+
}
25+
26+
def plot(self):
27+
fig, ax = plt.subplots()
28+
ax.plot(self.array)
29+
plt.show()
30+
31+
# Para cumplir con el principio de responsabilidad única, separamos las responsabilidades en dos clases diferentes.
32+
33+
class ImageStatistics:
34+
def __init__(self, array):
35+
self.array = array
36+
37+
def get_statistics(self):
38+
return {
39+
"mean": np.mean(self.array),
40+
"std": np.std(self.array),
41+
}
42+
43+
class ImagePlotter:
44+
def __init__(self, array):
45+
self.array = array
46+
47+
def plot(self):
48+
fig, ax = plt.subplots()
49+
ax.plot(self.array)
50+
plt.show()
51+
52+
53+
# ---------------------------------------------
54+
# Dificultad extra
55+
# Sistema de gestion para una bibioteca
56+
#
57+
# FORMA INCORRECTA
58+
#
59+
# ---------------------------------------------
60+
61+
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(message)s")
62+
63+
class Library:
64+
def __init__(self):
65+
self.books = []
66+
self.users = []
67+
68+
def add_user(self, name: str, id: int, email: str):
69+
self.users.append({
70+
"name": name,
71+
"id": id,
72+
"email": email,
73+
"books": [],
74+
}
75+
)
76+
logging.info(f"User {name} added successfully")
77+
78+
def add_book(self, title: str, author: str, copies: int):
79+
self.books.append({
80+
"title": title,
81+
"author": author,
82+
"copies": copies
83+
}
84+
)
85+
logging.info(f"Book {title} added successfully")
86+
87+
def print_books(self):
88+
for book in self.books:
89+
print(f"\tTitle: {book['title']}, Author: {book['author']}, Copies: {book['copies']}")
90+
91+
def print_users(self):
92+
for user in self.users:
93+
print(f"\tName: {user['name']}, ID: {user['id']}, Email: {user['email']}, Books: {user['books']}")
94+
95+
96+
def lend_book(self, title: str, name: str):
97+
98+
for book in self.books:
99+
if book["title"] == title:
100+
if book["copies"] > 0:
101+
book["copies"] -= 1
102+
logging.info(f"Book {title} borrowed by user {name}")
103+
else:
104+
logging.info(f"Book {title} is not available")
105+
break
106+
else:
107+
logging.warning(f"Book {title} not found")
108+
109+
for user in self.users:
110+
if user["name"] == name:
111+
user["books"].append(
112+
{
113+
"title": title,
114+
}
115+
)
116+
logging.info(f"Book {title} added to user {name}")
117+
break
118+
119+
def return_book(self, title: str, name: str):
120+
121+
for book in self.books:
122+
if book["title"] == title:
123+
book["copies"] += 1
124+
logging.info(f"Book {title} returned by user {name}")
125+
break
126+
else:
127+
logging.warning(f"Book {title} not found")
128+
129+
for user in self.users:
130+
if user["name"] == name:
131+
for book in user["books"]:
132+
if book["title"] == title:
133+
user["books"].remove(book)
134+
logging.info(f"Book {title} removed from user {name}")
135+
break
136+
137+
138+
# Testing the class
139+
print("\n"*3)
140+
print("### Testing: Dificultad extra (FORMA INCORRECTA)\n")
141+
my_library = Library()
142+
my_library.add_user("Alice", 1, "alice@dev")
143+
my_library.add_user("Bob", 2, "bob@dev")
144+
145+
my_library.add_book("The Hobbit", "J.R.R. Tolkien", 5)
146+
my_library.add_book("The Lord of the Rings", "J.R.R. Tolkien", 3)
147+
148+
print("\nBooks in the library:")
149+
my_library.print_books()
150+
151+
my_library.lend_book("The Hobbit", "Alice")
152+
153+
print("\nBooks in the library:")
154+
my_library.print_books()
155+
my_library.print_users()
156+
157+
158+
my_library.return_book("The Hobbit", "Alice")
159+
my_library.print_books()
160+
my_library.print_users()
161+
162+
163+
# ---------------------------------------------
164+
# Dificultad extra
165+
# Sistema de gestion para una bibioteca
166+
#
167+
# Forma CORRECTA
168+
#
169+
# Se crean dos clases diferentes, BooksManager y UsersManager, para manejar los libros y a los usuarios.
170+
# Se crea una clase que maneja la biblioteca y delega las responsabilidades a las clases BooksManeger y UsersManager.
171+
# ---------------------------------------------
172+
173+
class BooksManeger:
174+
def __init__(self):
175+
self.books = []
176+
177+
def add_book(self, title: str, author: str, copies: int):
178+
self.books.append(
179+
{"title": title, "author": author, "copies": copies}
180+
)
181+
logging.info(f"Book {title} added successfully")
182+
183+
def print_books(self):
184+
for book in self.books:
185+
print(f"\tTitle: {book['title']}, Author: {book['author']}, Copies: {book['copies']}")
186+
187+
def lend_book(self, title: str):
188+
for book in self.books:
189+
if book["title"] == title:
190+
if book["copies"] > 0:
191+
book["copies"] -= 1
192+
logging.info(f"Book {title} borrowed")
193+
else:
194+
logging.info(f"Book {title} is not available")
195+
break
196+
else:
197+
logging.warning(f"Book {title} not found")
198+
199+
def return_book(self, title: str):
200+
for book in self.books:
201+
if book["title"] == title:
202+
book["copies"] += 1
203+
logging.info(f"Book {title} returned")
204+
break
205+
else:
206+
logging.warning(f"Book {title} not found")
207+
208+
209+
class UsersManager:
210+
def __init__(self):
211+
self.users = []
212+
213+
def add_user(self, name: str, id: int, email: str):
214+
self.users.append(
215+
{"name": name, "id": id, "email": email, "books": []}
216+
)
217+
logging.info(f"User {name} added successfully")
218+
219+
def print_users(self):
220+
for user in self.users:
221+
print(f"\tName: {user['name']}, ID: {user['id']}, Email: {user['email']}, Books: {user['books']}")
222+
223+
def lend_book(self, title: str, name: str):
224+
for user in self.users:
225+
if user["name"] == name:
226+
user["books"].append({"title": title})
227+
logging.info(f"Book {title} added to user {name}")
228+
break
229+
else:
230+
logging.warning(f"User {name} not found")
231+
232+
def return_book(self, title: str, name: str):
233+
for user in self.users:
234+
if user["name"] == name:
235+
for book in user["books"]:
236+
if book["title"] == title:
237+
user["books"].remove(book)
238+
logging.info(f"Book {title} removed from user {name}")
239+
break
240+
break
241+
else:
242+
logging.warning(f"User {name} not found")
243+
244+
class Library_v2:
245+
def __init__(self):
246+
self.books_m = BooksManeger()
247+
self.users_m = UsersManager()
248+
249+
def add_user(self, name: str, id: int, email: str):
250+
self.users_m.add_user(name, id, email)
251+
252+
def add_book(self, title: str, author: str, copies: int):
253+
self.books_m.add_book(title, author, copies)
254+
255+
def print_books(self):
256+
self.books_m.print_books()
257+
258+
def print_users(self):
259+
self.users_m.print_users()
260+
261+
def lend_book(self, title: str, name: str):
262+
self.books_m.lend_book(title)
263+
self.users_m.lend_book(title, name)
264+
265+
def return_book(self, title: str, name: str):
266+
self.books_m.return_book(title)
267+
self.users_m.return_book(title, name)
268+
269+
270+
# Testing the classes
271+
print("\n"*3)
272+
print("### Testing: Dificultad extra (FORMA CORRECTA)\n")
273+
274+
my_library_v2 = Library_v2()
275+
my_library_v2.add_user("Alice", 1, "alice@dev")
276+
my_library_v2.add_user("Bob", 2, "bob@dev")
277+
278+
my_library_v2.add_book("The Hobbit", "J.R.R. Tolkien", 5)
279+
my_library_v2.add_book("The Lord of the Rings", "J.R.R. Tolkien", 3)
280+
281+
print("\nBooks in the library:")
282+
my_library_v2.print_books()
283+
284+
my_library_v2.lend_book("The Hobbit", "Alice")
285+
286+
print("\nBooks in the library:")
287+
my_library_v2.print_books()
288+
289+
print("\nUsers in the library:")
290+
my_library_v2.print_users()
291+
292+
my_library_v2.return_book("The Hobbit", "Alice")
293+
294+
print("\nBooks in the library:")
295+
my_library_v2.print_books()
296+
297+
print("\nUsers in the library:")
298+
my_library_v2.print_users()

0 commit comments

Comments
 (0)