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