Open-Close
El Principio Abierto/Cerrado (OCP) es uno de los principios SOLID de dise帽o orientado a objetos, formulado por Bertrand Meyer. OCP sugiere que una clase deber铆a estar abierta para la extensi贸n pero cerrada para la modificaci贸n. En otras palabras, el comportamiento de una clase puede ampliarse sin alterar su c贸digo fuente.
Principios clave del Principio Abierto/Cerrado (OCP):
Abierto para la Extensi贸n:
- La parte "abierta" de OCP anima a los desarrolladores a dise帽ar clases de manera que permita la adici贸n de nuevas funcionalidades sin modificar el c贸digo existente.
- Las extensiones pueden lograrse mediante la herencia, composici贸n u otros medios, garantizando flexibilidad en el software.
Cerrado para la Modificaci贸n:
- Una vez que se establece y prueba una clase, su c贸digo fuente deber铆a permanecer cerrado para modificaciones.
- El objetivo es evitar efectos secundarios no deseados en funcionalidades existentes y mantener la estabilidad.
Encapsulaci贸n:
- OCP promueve la encapsulaci贸n, haciendo hincapi茅 en la encapsulaci贸n del comportamiento dentro de las clases.
- Las nuevas funcionalidades deben agregarse mediante la creaci贸n de nuevas clases en lugar de modificar las existentes.
Estabilidad del C贸digo:
- Al adherirse a OCP, los desarrolladores contribuyen a la estabilidad del c贸digo, reduciendo el riesgo de introducir errores o romper funciones existentes al extender el sistema.
Facilidad de Mantenimiento:
- El aspecto cerrado para la modificaci贸n simplifica el mantenimiento, ya que los desarrolladores pueden centrarse en extender funcionalidades en nuevas clases sin revisitar o arriesgarse a cambios en el c贸digo existente y bien establecido.
Ejemplo:
Considera un sistema que calcula las 谩reas de diferentes formas. Sin adherirse a OCP, agregar una nueva forma requiere modificar la clase AreaCalculator
existente. Siguiendo OCP, podemos crear un dise帽o que permita una f谩cil extensi贸n sin alterar la clase existente.
# Sin OCP
class AreaCalculator:
def calculate_area(self, shape):
if isinstance(shape, Square):
# Calcular 谩rea para un cuadrado
elif isinstance(shape, Circle):
# Calcular 谩rea para un c铆rculo
# ... (m谩s formas)
# Con OCP
class AreaCalculator:
def calculate_area(self, shape):
# Delegar el c谩lculo a la clase espec铆fica de la forma
return shape.calculate_area()
class Shape:
def calculate_area(self):
pass
class Square(Shape):
def calculate_area(self):
# Calcular 谩rea para un cuadrado
class Circle(Shape):
def calculate_area(self):
# Calcular 谩rea para un c铆rculo
En el ejemplo compatible con OCP, cada forma tiene su propia clase y es responsable de calcular su propia 谩rea. Esto se adhiere a OCP al permitir la extensi贸n del sistema con nuevas formas sin modificar la clase AreaCalculator
existente.