[O] El Principio Abierto-Cerrado

[O] El Principio Abierto-Cerrado (OCP): Extender Comportamientos sin Modificar el Código.

El Principio Abierto-Cerrado (OCP) es un principio fundamental de los principios de diseño SOLID. Promueve la idea de que una clase debe ser diseñada para ser abierta a la extensión pero cerrada a la modificación. Esto significa que el comportamiento de una clase debe ser fácilmente extensible sin cambiar el código existente. Al adherirse a este principio, los desarrolladores pueden crear código más flexible, mantenible y escalable.

Uno de los errores comunes que violan el OCP es tener una clase que codifica en duro los comportamientos para diferentes formas. Por ejemplo, considera el siguiente código:

class AreaCalculator {
    private val shapes = listOf("circle", "square", "triangle")
    fun calculateArea(shape: String): Double {
        return when (shape) {
            "circle" -> 3.14 * (5 * 5)
            "square" -> 5 * 5
            "triangle" -> 0.5 * (5 * 5)
            else -> 0.0
        }
    }
}

Aquí, la clase AreaCalculator calcula el área de diferentes formas. Si queremos agregar más formas o cambiar el cálculo del área para cualquier forma, tenemos que modificar la clase AreaCalculator, lo cual viola el principio OCP.

Para adherirse al OCP, una práctica mejor es definir una interfaz Shape que defina un método para calcular el área y crear clases separadas para cada forma que implemente la interfaz Shape. De esta manera, el comportamiento de la clase puede ser extendido creando nuevas clases que implementen la interfaz Shape, sin modificar el código existente. Aquí hay un ejemplo:

interface Shape {
    fun calculateArea(): Double
}

class Circle(private val radius: Double) : Shape {
    override fun calculateArea() = 3.14 * (radius * radius)
}

class Square(private val side: Double) : Shape {
    override fun calculateArea() = side * side
}

class Triangle(private val base: Double, private val height: Double) : Shape {
    override fun calculateArea() = 0.5 * (base * height)
}

Con este enfoque, agregar nuevas formas o modificar el cálculo de una forma existente solo requiere crear una nueva clase que implemente la interfaz Shape. Esto cumple con el principio OCP, haciendo que el código sea más flexible, mantenible y escalable.

En conclusión, el principio OCP ayuda a los desarrolladores a crear software que pueda ser fácilmente extendido sin modificar el código existente. Al utilizar interfaces y herencia, el comportamiento de una clase puede ser extendido sin cambiar el código existente, lo que lo hace más flexible y fácil de mantener.