Principios de diseño en POO

Acoplamiento


En la Programación Orientada a Objetos, escribir buen código no solo implica que funcione correctamente, sino también que sea mantenible, reutilizable y escalable. Para lograrlo, es fundamental aplicar principios sólidos de diseño. Dos de los conceptos más importantes en este sentido son el acoplamiento y la cohesión. Ambos influyen directamente en la calidad y estructura del software.


¿Qué es el acoplamiento?

El acoplamiento se refiere al grado de dependencia entre dos módulos o clases dentro de un sistema. En otras palabras, mide cuán conectados están dos componentes del software y cuánto sabe uno sobre el otro.


Tipos de acoplamiento:

  • Acoplamiento fuerte (alto): Un módulo depende directamente de los detalles internos de otro. Cualquier cambio en uno puede requerir modificar el otro. Esto hace que el mantenimiento sea complejo y el código menos reutilizable.
  • Acoplamiento débil (bajo): Los módulos son independientes entre sí. Solo interactúan a través de interfaces bien definidas, lo que facilita su reutilización, prueba y mantenimiento.

El objetivo en diseño orientado a objetos es lograr acoplamiento bajo, ya que esto nos permite construir sistemas más flexibles, modulares y resistentes a cambios inesperados.


¿Por qué evitar el acoplamiento fuerte?

  • Mayor fragilidad: Un pequeño cambio en un módulo puede generar errores en otro que depende de él, aún si no se modificó directamente.
  • Menor reutilización: Si una clase depende de otras para funcionar, no se puede reutilizar fácilmente en diferentes contextos.
  • Difícil mantenimiento: Cambiar una parte del sistema puede requerir modificaciones en múltiples módulos.

Ejemplo de acoplamiento fuerte en Python:

# Clase fuertemente acoplada
class Clase1:
    x = 10

class Clase2:
    def mi_metodo(self):
        return Clase1.x * 2  # Depende directamente del atributo de otra clase

En este ejemplo, Clase2 depende directamente de la implementación interna de Clase1. Si el atributo x cambia de nombre, tipo o desaparece, Clase2 dejará de funcionar correctamente.


Mejora: diseño con acoplamiento débil

# Diseño con acoplamiento débil
class Clase1:
    def __init__(self, x):
        self.x = x

    def obtener_valor(self):
        return self.x

class Clase2:
    def __init__(self, clase1):
        self.clase1 = clase1

    def mi_metodo(self):
        return self.clase1.obtener_valor() * 2

Aquí, Clase2 depende solo de la interfaz pública de Clase1 (obtener_valor()), lo cual reduce el acoplamiento y permite que ambas clases evolucionen de manera más independiente.