Open-Closed Principle

Open In Colab

2.2. Open-Closed Principle#

El Principio de Abierto/Cerrado (Open/Closed Principle - OCP) es uno de los cinco principios SOLID del diseño de software. Fue propuesto por Bertrand Meyer en su libro “Object-Oriented Software Construction”. El OCP establece que las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas para su extensión pero cerradas para su modificación.

2.2.1. Definición del OCP:#

El principio OCP establece que una clase debe estar abierta para su extensión, lo que significa que debe ser posible agregar nuevas funcionalidades a la clase sin modificar su código fuente. Sin embargo, la clase debe estar cerrada para su modificación, lo que significa que su comportamiento existente no debe ser alterado. En lugar de modificar la clase existente, se deben crear nuevas clases que extiendan o implementen interfaces existentes para agregar nuevas funcionalidades.

2.2.2. Ejemplo del OCP:#

Supongamos que tenemos una clase Shape que representa diferentes formas geométricas. Originalmente, la clase Shape tiene un método area() para calcular el área de la forma. Siguiendo el principio OCP, si queremos agregar nuevas formas geométricas sin modificar la clase Shape, podemos crear nuevas clases que extiendan la funcionalidad existente.

from abc import ABC, abstractmethod

# Clase base para formas geométricas
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# Clase para un círculo
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

# Clase para un cuadrado
class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side ** 2

# Clase para un triángulo
class Triangle(Shape):
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def area(self):
        return 0.5 * self.base * self.height
# Uso del principio OCP
circle = Circle(5)
square = Square(4)
triangle = Triangle(3, 6)

print("Área del círculo:", circle.area())
print("Área del cuadrado:", square.area())
print("Área del triángulo:", triangle.area())
Área del círculo: 78.5
Área del cuadrado: 16
Área del triángulo: 9.0

En este ejemplo, la clase Shape está cerrada para su modificación, ya que no se ha modificado su código. Sin embargo, está abierta para su extensión, ya que se han creado nuevas clases (Circle, Square y Triangle) que extienden la funcionalidad existente. Esto sigue el principio OCP y hace que el código sea más flexible y fácil de mantener.