Skip to content

Commit aba0153

Browse files
authored
Merge pull request mouredev#6976 from Hequebo/hequebo27
#27 - C#
2 parents 113ec87 + 536e70e commit aba0153

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed

Roadmap/27 - SOLID OCP/c#/hequebo.cs

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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

Comments
 (0)