|
| 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