|
| 1 | +/* |
| 2 | + * Principio Abierto-Cerrado (OCP) de SOLID |
| 3 | + * |
| 4 | + * El principio OCP establece que las entidades de software (clases, módulos, funciones, etc.) |
| 5 | + * deben estar abiertas para la extensión, pero cerradas para la modificación. Esto significa |
| 6 | + * que debemos poder extender el comportamiento de una clase sin modificar su código existente. |
| 7 | + * |
| 8 | + * En este ejemplo, demostraremos cómo aplicar el OCP en el diseño de una calculadora, |
| 9 | + * permitiendo agregar nuevas operaciones sin modificar el código existente. |
| 10 | + */ |
| 11 | + |
| 12 | +// Interfaz que define la operación matemática |
| 13 | +interface Operation { |
| 14 | + fun execute(a: Double, b: Double): Double |
| 15 | +} |
| 16 | + |
| 17 | +// Implementaciones de las operaciones básicas |
| 18 | +class Addition : Operation { |
| 19 | + override fun execute(a: Double, b: Double) = a + b |
| 20 | +} |
| 21 | + |
| 22 | +class Subtraction : Operation { |
| 23 | + override fun execute(a: Double, b: Double) = a - b |
| 24 | +} |
| 25 | + |
| 26 | +class Multiplication : Operation { |
| 27 | + override fun execute(a: Double, b: Double) = a * b |
| 28 | +} |
| 29 | + |
| 30 | +class Division : Operation { |
| 31 | + override fun execute(a: Double, b: Double): Double { |
| 32 | + if (b == 0.0) throw IllegalArgumentException("Cannot divide by zero") |
| 33 | + return a / b |
| 34 | + } |
| 35 | +} |
| 36 | + |
| 37 | +// Calculadora que utiliza el principio OCP |
| 38 | +class Calculator { |
| 39 | + private val operations = mutableMapOf<String, Operation>() |
| 40 | + |
| 41 | + fun addOperation(name: String, operation: Operation) { |
| 42 | + operations[name] = operation |
| 43 | + } |
| 44 | + |
| 45 | + fun calculate(a: Double, b: Double, operationName: String): Double { |
| 46 | + val operation = operations[operationName] |
| 47 | + ?: throw IllegalArgumentException("Operation not supported") |
| 48 | + return operation.execute(a, b) |
| 49 | + } |
| 50 | +} |
| 51 | + |
| 52 | +// Ejemplo de uso y prueba |
| 53 | +fun main() { |
| 54 | + val calculator = Calculator() |
| 55 | + |
| 56 | + // Agregar operaciones básicas |
| 57 | + calculator.addOperation("add", Addition()) |
| 58 | + calculator.addOperation("subtract", Subtraction()) |
| 59 | + calculator.addOperation("multiply", Multiplication()) |
| 60 | + calculator.addOperation("divide", Division()) |
| 61 | + |
| 62 | + // Probar operaciones básicas |
| 63 | + println("5 + 3 = ${calculator.calculate(5.0, 3.0, "add")}") |
| 64 | + println("5 - 3 = ${calculator.calculate(5.0, 3.0, "subtract")}") |
| 65 | + println("5 * 3 = ${calculator.calculate(5.0, 3.0, "multiply")}") |
| 66 | + println("6 / 3 = ${calculator.calculate(6.0, 3.0, "divide")}") |
| 67 | + |
| 68 | + // Agregar una nueva operación (potencia) sin modificar el código existente |
| 69 | + class Power : Operation { |
| 70 | + override fun execute(a: Double, b: Double) = Math.pow(a, b) |
| 71 | + } |
| 72 | + calculator.addOperation("power", Power()) |
| 73 | + |
| 74 | + // Probar la nueva operación |
| 75 | + println("2^3 = ${calculator.calculate(2.0, 3.0, "power")}") |
| 76 | +} |
0 commit comments