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.