Skip to content

Commit eaacbda

Browse files
committed
#27 - Kotlin
1 parent da08955 commit eaacbda

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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

Comments
 (0)