Skip to content

Commit 2973f80

Browse files
committed
feat: #27-Python
Reto #27-Python realizado por mrodara
1 parent 439e6ff commit 2973f80

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#### SOLID PRINCIPIO ABIERTO-CERRADO (OCP)
2+
3+
'''
4+
Este principio establece que las clases deben estar abiertas para la extensión, pero cerradas para la modificación.
5+
6+
En otras palabras, puedes agregar nuevas funcionalidades a una clase sin modificar su código existente.
7+
Esto ayuda a evitar errores inesperados en el código ya probado y a facilitar la escalabilidad.
8+
'''
9+
10+
'''
11+
Ventajas:
12+
13+
Protege el código existente
14+
Facilita la extensión
15+
Favorece el diseño modular
16+
'''
17+
18+
# Ejemplo que inclumple OCP
19+
20+
#class CalculadoraArea():
21+
# def calcular_area(self, forma):
22+
# if forma.lower() == "circulo":
23+
# radio = float(input("Introduce el radio de la circunferencia: "))
24+
# return 3.14 * (radio ** 2)
25+
# elif forma.lower() == "cuadrado":
26+
# lado = float(input("Introduce longitud de lado: "))
27+
# return lado ** 2
28+
#
29+
#print(CalculadoraArea().calcular_area("Circulo"))
30+
#print(CalculadoraArea().calcular_area("cuadrado"))
31+
32+
# Fin Ejemplo que inclumple OCP
33+
34+
# Podemos usar polimorfismo para cumplir con el OCP, creando una clase base o interfaz que permita
35+
# a las formas geométricas implementar su propio método de cálculo de área.
36+
37+
from abc import ABC, abstractmethod
38+
39+
# Clase abstracta para formas geométricas
40+
#class Forma(ABC):
41+
# @abstractmethod
42+
# def calcular_area(self):
43+
# pass
44+
#
45+
## Implementaciones específicas de formas
46+
#class Circulo(Forma):
47+
# def __init__(self, radius):
48+
# self.radius = radius
49+
#
50+
# def calcular_area(self):
51+
# return 3.14 * (self.radius ** 2)
52+
#
53+
#class Cuadrado(Forma):
54+
# def __init__(self, side):
55+
# self.side = side
56+
#
57+
# def calcular_area(self):
58+
# return self.side ** 2
59+
#
60+
## Prueba
61+
#formas = [
62+
# Circulo(5),
63+
# Cuadrado(4)
64+
#]
65+
#
66+
#for forma in formas:
67+
# print(forma.calcular_area()) # Output: 78.5, 16
68+
69+
class Calculadora(ABC):
70+
71+
@abstractmethod
72+
def calcular(self):
73+
pass
74+
75+
class Suma(Calculadora):
76+
77+
def calcular(self, a, b):
78+
return a + b
79+
80+
class Resta(Calculadora):
81+
def calcular(self, a, b):
82+
return a - b
83+
84+
class Multiplicacion(Calculadora):
85+
def calcular(self, a, b):
86+
return a * b
87+
88+
class Division(Calculadora):
89+
def calcular(self, a, b):
90+
if b == 0:
91+
raise ValueError("No se puede dividir por cero")
92+
return a / b
93+
94+
# Para añadir una quinta operación es sencillo creando un nuevo método abstracto y su correspondiente clase
95+
class Potencia2(Calculadora):
96+
def calcular(self, a):
97+
return a ** 2
98+
99+
# Pruebas de calculadora
100+
a = 560
101+
b = 12
102+
103+
operaciones = [
104+
Suma(),
105+
Resta(),
106+
Multiplicacion(),
107+
Division(),
108+
Potencia2()
109+
]
110+
111+
for operacion in operaciones:
112+
if isinstance(operacion, Suma):
113+
print(f"La suma de {a} y {b} es: {operacion.calcular(a, b)}")
114+
elif isinstance(operacion, Resta):
115+
print(f"La resta de {a} y {b} es: {operacion.calcular(a,b)}")
116+
elif isinstance(operacion, Multiplicacion):
117+
print(f"La multiplicación de {a} y {b} es: {operacion.calcular(a,b)}")
118+
elif isinstance(operacion, Division):
119+
print(f"La división de {a} y {b} es: {operacion.calcular(a,b)}")
120+
else:
121+
print(f"El cuadrado de {a} es: {operacion.calcular(a)}")
122+
#
123+
#suma = Suma()
124+
#print(suma.calcular(a, b))
125+
#
126+
#resta = Resta()
127+
#print(resta.calcular(a, b))
128+
#
129+
#multiplicacion = Multiplicacion()
130+
#print(multiplicacion.calcular(a, b))
131+
#
132+
#division = Division()
133+
#print(division.calcular(a, b))
134+
#
135+
#potencia2 = Potencia2()
136+
#print(potencia2.calcular(a))
137+
138+
#### FIN SOLID PRINCIPIO ABIERTO-CERRADO (OCP)

0 commit comments

Comments
 (0)