1
+ /*
2
+ * El Principio Abierto Cerrado (SRP)
3
+ * nos dice que una clase tiene que estar
4
+ * abierta para su extensión pero cerrada
5
+ * para su modificación
6
+ */
7
+ class Program
8
+ {
9
+ static void Main ( string [ ] args )
10
+ {
11
+ // Incorrecto
12
+ Shape square = new Shape ( ) ;
13
+ square . Width = 3 ;
14
+ square . Height = 3 ;
15
+ AreaCalculator areaCalculator = new AreaCalculator ( ) ;
16
+ double area = areaCalculator . CalculateArea ( square ) ;
17
+ Console . WriteLine ( $ "El área es de { area } m2") ;
18
+
19
+ // Correcto
20
+ Rectangle rectangle = new Rectangle ( ) ;
21
+ rectangle . Width = 3 ;
22
+ rectangle . Height = 5 ;
23
+ AreaCalculatorOCP areaCalculatorOCP = new AreaCalculatorOCP ( ) ;
24
+ area = areaCalculatorOCP . CalculateArea ( rectangle ) ;
25
+ Console . WriteLine ( $ "El área es de { area } m2") ;
26
+
27
+ Circle circle = new Circle ( ) ;
28
+ circle . Radius = 5.2 ;
29
+ area = areaCalculatorOCP . CalculateArea ( circle ) ;
30
+ Console . WriteLine ( $ "El área es de { area } m2") ;
31
+
32
+ // Ejercicio Extra
33
+ Console . WriteLine ( "---Ejercicio Extra---" ) ;
34
+ Calculator calculator = new Calculator ( ) ;
35
+ calculator . AddOperation ( "Suma" , new Addition ( ) ) ;
36
+ calculator . AddOperation ( "Resta" , new Substraction ( ) ) ;
37
+ calculator . AddOperation ( "Multiplicación" , new Multiplication ( ) ) ;
38
+ calculator . AddOperation ( "División" , new Division ( ) ) ;
39
+ calculator . AddOperation ( "Potencia" , new Pow ( ) ) ;
40
+
41
+ Console . WriteLine ( $ "2 + 3 = { calculator . ExecuteOperation ( "Suma" , 2 , 3 ) } ") ;
42
+ Console . WriteLine ( $ "2 - 3 = { calculator . ExecuteOperation ( "Resta" , 2 , 3 ) } ") ;
43
+ Console . WriteLine ( $ "2 * 3 = { calculator . ExecuteOperation ( "Multiplicación" , 2 , 3 ) } ") ;
44
+ Console . WriteLine ( $ "2 / 3 = { calculator . ExecuteOperation ( "División" , 2 , 3 ) } ") ;
45
+ Console . WriteLine ( $ "2^3 = { calculator . ExecuteOperation ( "Potencia" , 2 , 3 ) } ") ;
46
+
47
+ }
48
+ }
49
+
50
+ // Incorrecto
51
+ class Shape
52
+ {
53
+ public double Width { get ; set ; }
54
+ public double Height { get ; set ; }
55
+
56
+ }
57
+ class AreaCalculator
58
+ {
59
+ /*
60
+ * La función CalculateArea solo funciona
61
+ * para rectangulos. Si quisieramos calcular
62
+ * el área de otras formas la función tendría
63
+ * que ser modificada, lo cual rompe el principio
64
+ * de Abierto Cerrado
65
+ */
66
+ public double CalculateArea ( Shape shape ) => shape . Width * shape . Height ;
67
+ }
68
+
69
+ // Correcto
70
+ /*
71
+ * Para cumplir con el principio Abierto Cerrado
72
+ * podemos utilizar abstracción y herencia para
73
+ * crear clases separadas para cada tipo de forma
74
+ * y proveer un metodo consistente para el cálculo
75
+ * de su area
76
+ */
77
+ interface IShape
78
+ {
79
+ public double CalculateArea ( ) ;
80
+ }
81
+ class Rectangle : IShape
82
+ {
83
+ public double Height { get ; set ; }
84
+ public double Width { get ; set ; }
85
+
86
+ public double CalculateArea ( ) => Height * Width ;
87
+ }
88
+ class Circle : IShape
89
+ {
90
+ public double Radius { get ; set ; }
91
+
92
+ public double CalculateArea ( ) => Math . PI * Math . Pow ( Radius , 2 ) ;
93
+ }
94
+ class AreaCalculatorOCP
95
+ {
96
+ public double CalculateArea ( IShape shape ) => shape . CalculateArea ( ) ;
97
+ }
98
+
99
+ // Ejercicio Extra
100
+ interface IOperation
101
+ {
102
+ public double Execute ( double a , double b ) ;
103
+ }
104
+ class Addition : IOperation
105
+ {
106
+
107
+ public double Execute ( double a , double b ) => a + b ;
108
+ }
109
+ class Substraction : IOperation
110
+ {
111
+ public double Execute ( double a , double b ) => a - b ;
112
+ }
113
+ class Multiplication : IOperation
114
+ {
115
+ public double Execute ( double a , double b ) => a * b ;
116
+ }
117
+ class Division : IOperation
118
+ {
119
+ public double Execute ( double a , double b ) => a / b ;
120
+ }
121
+ class Pow : IOperation
122
+ {
123
+ public double Execute ( double a , double b ) => Math . Pow ( a , b ) ;
124
+ }
125
+ class Calculator
126
+ {
127
+ private Dictionary < string , IOperation > _operations ;
128
+
129
+ public Calculator ( )
130
+ {
131
+ _operations = new Dictionary < string , IOperation > ( ) ;
132
+ }
133
+
134
+ public void AddOperation ( string name , IOperation operation ) => _operations . Add ( name , operation ) ;
135
+ public double ExecuteOperation ( string name , double a , double b )
136
+ {
137
+ if ( ! _operations . ContainsKey ( name ) )
138
+ {
139
+ Console . WriteLine ( "La operación no existe" ) ;
140
+ return 0 ;
141
+ }
142
+ return _operations [ name ] . Execute ( a , b ) ;
143
+ }
144
+ }
0 commit comments