Skip to content

Commit 05cfec4

Browse files
committed
#27 - python
1 parent 5b2228a commit 05cfec4

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#27 SOLID: PRINCIPIO ABIERTO-CERRADO (OCP)
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+
* DIFICULTAD EXTRA (opcional):
10+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
11+
* Requisitos:
12+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
13+
* Instrucciones:
14+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
15+
* 2. Comprueba que el sistema funciona.
16+
* 3. Agrega una quinta operación para calcular potencias.
17+
* 4. Comprueba que se cumple el OCP.
18+
*/
19+
"""
20+
21+
class Usuario:
22+
def __init__(self, nombre, email=None, sms=None):
23+
self.nombre = nombre
24+
self.email = email
25+
self.sms = sms
26+
27+
class Notificar:
28+
def __init__(self, usuario, mensaje):
29+
self.usuario = usuario
30+
self.mensaje = mensaje
31+
32+
def notificar(self):
33+
raise NotImplementedError("Este método debe ser sobrescrito por una subclase.")
34+
35+
class NotificarEmail(Notificar):
36+
def notificar(self):
37+
if self.usuario.email:
38+
return f"Enviamos el mensaje: '{self.mensaje}' por Email a {self.usuario.email}"
39+
else:
40+
return "Este usuario no tiene email registrado."
41+
42+
class NotificarSMS(Notificar):
43+
def notificar(self):
44+
if self.usuario.sms:
45+
return f"Enviamos el mensaje: '{self.mensaje}' por SMS a {self.usuario.sms}"
46+
else:
47+
return "Este usuario no tiene número de SMS registrado."
48+
49+
# Ejemplo de uso:
50+
usuario_uno = Usuario("Santiago", email="[email protected]")
51+
usuario_dos = Usuario("George", sms="123456789")
52+
53+
notificacion_uno = NotificarEmail(usuario_uno, "Los números amigos no sirven de nada.")
54+
notificacion_dos = NotificarSMS(usuario_dos, "Enseñame a soldar.")
55+
56+
print(notificacion_uno.notificar()) # Correcto, tiene email
57+
print(notificacion_dos.notificar()) # Correcto, tiene SMS
58+
59+
# Extra
60+
61+
class Calculadora:
62+
"""
63+
Clase base para operaciones de cálculo.
64+
Esta clase debe ser heredada para implementar operaciones específicas.
65+
"""
66+
67+
def calcular(self, valores: list[float]) -> float:
68+
"""
69+
Método que debe ser sobrescrito en las clases derivadas.
70+
71+
:param valores: Lista de valores a operar.
72+
:return: Resultado de la operación.
73+
"""
74+
raise NotImplementedError("Este método debe ser sobrescrito por una clase derivada.")
75+
76+
class Sumar(Calculadora):
77+
"""
78+
Clase que implementa la operación de suma.
79+
"""
80+
81+
def calcular(self, valores: list[float]) -> float:
82+
83+
return sum(valores)
84+
85+
class Resta(Calculadora):
86+
"""
87+
Clase que implementa la operación de resta.
88+
"""
89+
90+
def calcular(self, valores: list[float]) -> float:
91+
92+
resultado = valores[0]
93+
for valor in valores[1:]:
94+
resultado -= valor
95+
return resultado
96+
97+
class Multiplicar(Calculadora):
98+
"""
99+
Clase que implementa la operación de multiplicación.
100+
"""
101+
102+
def calcular(self, valores: list[float]) -> float:
103+
104+
resultado = 1
105+
for valor in valores:
106+
resultado *= valor
107+
return resultado
108+
109+
class Division(Calculadora):
110+
"""
111+
Clase que implementa la operación de división.
112+
"""
113+
114+
def calcular(self, valores: list[float]) -> float:
115+
116+
resultado = valores[0]
117+
for valor in valores[1:]:
118+
if valor == 0:
119+
raise ZeroDivisionError("No se puede dividir por cero.")
120+
resultado /= valor
121+
return resultado
122+
123+
class Potencia(Calculadora):
124+
"""
125+
Clase que implementa la operación de potencia.
126+
"""
127+
128+
def calcular(self, valores: list[float]) -> float:
129+
130+
resultado = valores[0]
131+
for valor in valores[1:]:
132+
resultado **= valor
133+
return resultado
134+
135+
# Ejemplo de uso
136+
137+
suma = Sumar()
138+
resta = Resta()
139+
multiplicacion = Multiplicar()
140+
division = Division()
141+
potencia = Potencia()
142+
143+
# Valores para operar
144+
valores = [10, 2, 3]
145+
146+
# Realizar las operaciones y mostrar los resultados
147+
print(f"Suma: {suma.calcular(valores)}") # Suma: 15
148+
print(f"Resta: {resta.calcular(valores)}") # Resta: 5
149+
print(f"Multiplicación: {multiplicacion.calcular(valores)}") # Multiplicación: 60
150+
print(f"División: {division.calcular([100, 2, 5])}") # División: 10.0
151+
print(f"Potencia: {potencia.calcular([2, 3, 2])}") # Potencia: 64

0 commit comments

Comments
 (0)