Skip to content

Commit b47fb02

Browse files
authored
Merge pull request mouredev#4717 from Kenysdev/27.cs
#27 - c#
2 parents 878ddb9 + f6f4071 commit b47fb02

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed

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

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
namespace exs27;
2+
/*
3+
╔══════════════════════════════════════╗
4+
║ Autor: Kenys Alvarado ║
5+
║ GitHub: https://github.com/Kenysdev ║
6+
║ 2024 - C# ║
7+
╚══════════════════════════════════════╝
8+
-------------------------------------------------
9+
* SOLID: PRINCIPIO ABIERTO-CERRADO (OCP)
10+
-------------------------------------------------
11+
- Una entidad de software que está abierta a extensión, pero cerrada a modificación,
12+
esto significa que debemos poder extender el comportamiento de una clase sin
13+
necesidad de modificar su código fuente original.
14+
15+
_______________
16+
* EJERCICIO #1:
17+
* Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
18+
* y crea un ejemplo simple donde se muestre su funcionamiento
19+
* de forma correcta e incorrecta.
20+
*/
21+
22+
// Abstract base class Product
23+
public abstract class Product(string name, decimal price)
24+
{
25+
public string Name { get; set; } = name;
26+
public decimal Price { get; set; } = price;
27+
28+
// Abstract method
29+
public abstract decimal ApplyDiscount();
30+
31+
// Concrete metho
32+
public decimal FinalPrice()
33+
{
34+
return Price - ApplyDiscount();
35+
}
36+
}
37+
38+
// Concrete class
39+
public class ElectronicsProduct(string name, decimal price) : Product(name, price)
40+
{
41+
public override decimal ApplyDiscount()
42+
{
43+
return Price * 0.05m; // Discount of 5%
44+
}
45+
}
46+
47+
48+
// Concrete class
49+
public class ClothingProduct(string name, decimal price) : Product(name, price)
50+
{
51+
public override decimal ApplyDiscount()
52+
{
53+
if (Price > 50)
54+
return 10; // Discount of $10 if price is over $50
55+
else
56+
return 0; // No discount otherwise
57+
}
58+
}
59+
60+
/*
61+
_______________
62+
* EJERCICIO #2:
63+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
64+
* Requisitos:
65+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
66+
* Instrucciones:
67+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
68+
* 2. Comprueba que el sistema funciona.
69+
* 3. Agrega una quinta operación para calcular potencias.
70+
* 4. Comprueba que se cumple el OCP.
71+
*/
72+
73+
// Abstract base
74+
public abstract class Calculator(double a, double b)
75+
{
76+
protected double a = a;
77+
protected double b = b;
78+
79+
// Abstract method
80+
public abstract double MathOperation();
81+
82+
// Concrete method
83+
public void PrintResult()
84+
{
85+
Console.WriteLine($"Es: {MathOperation()}");
86+
}
87+
}
88+
89+
public class Sum(double a, double b) : Calculator(a, b)
90+
{
91+
public override double MathOperation()
92+
{
93+
Console.WriteLine($"\nSuma de {a} + {b}:");
94+
return a + b;
95+
}
96+
}
97+
98+
public class Subtraction(double a, double b) : Calculator(a, b)
99+
{
100+
public override double MathOperation()
101+
{
102+
Console.WriteLine($"\nResta de {a} - {b}:");
103+
return a - b;
104+
}
105+
}
106+
107+
public class Multiplication(double a, double b) : Calculator(a, b)
108+
{
109+
public override double MathOperation()
110+
{
111+
Console.WriteLine($"\nMultiplicación de {a} * {b}:");
112+
return a * b;
113+
}
114+
}
115+
116+
public class Division(double a, double b) : Calculator(a, b)
117+
{
118+
public override double MathOperation()
119+
{
120+
Console.WriteLine($"\nDivisión de {a} / {b}:");
121+
if (b != 0)
122+
return a / b;
123+
else
124+
throw new ArgumentException("DivisionErrorbyZero.");
125+
}
126+
}
127+
128+
public class Pow(double a, double b) : Calculator(a, b)
129+
{
130+
public override double MathOperation()
131+
{
132+
Console.WriteLine($"\nPotencia de {a} ^ {b}:");
133+
return Math.Pow(a, b);
134+
}
135+
}
136+
137+
//__________________
138+
public class Program
139+
{
140+
public static void ProcessProduct(Product product)
141+
{
142+
Console.WriteLine($"Producto: {product.Name}, Precio final: {product.FinalPrice()}");
143+
}
144+
145+
static void Main()
146+
{
147+
ElectronicsProduct laptop = new("Laptop", 700 );
148+
ClothingProduct pants = new("Pants", 55);
149+
150+
ProcessProduct(laptop);
151+
ProcessProduct(pants);
152+
153+
//___________________________
154+
// exs 2
155+
156+
Sum sum = new(2, 2);
157+
sum.PrintResult();
158+
159+
Subtraction subtraction = new(2, 2);
160+
subtraction.PrintResult();
161+
162+
Multiplication multiplication = new(2, 2);
163+
multiplication.PrintResult();
164+
165+
Division division = new(2, 2);
166+
division.PrintResult();
167+
168+
Pow pow = new(2, 2);
169+
pow.PrintResult();
170+
171+
}
172+
}

0 commit comments

Comments
 (0)