Composición sobre Herencia
Usa composición (delegación de comportamientos) en lugar de herencia para evitar acoplamiento rígido.
Composición y herencia son dos conceptos clave en la programación orientada a objetos para estructurar y organizar el código. Aunque la herencia tiene su lugar en ciertos escenarios, el principio de "preferir composición sobre herencia" (composition over inheritance) ayuda a crear sistemas más flexibles, reutilizables y desacoplados.
1. Ventajas de Usar Composición #
-
Evita Jerarquías Rígidas: No dependes de una estructura de herencia que puede volverse difícil de mantener.
-
Reutilización: Los comportamientos (
PuedeVolar,PuedeNadar) pueden ser usados por múltiples clases. -
Mayor Flexibilidad: Puedes cambiar o extender los comportamientos sin afectar a otras partes del sistema.
-
Mantenibilidad: Las clases tienen responsabilidades claras y están desacopladas.
2. Cuándo Usar Composición en Lugar de Herencia #
-
Cuando una relación "tiene un" es más adecuada que "es un". Ejemplo: Un auto "tiene un" motor, no "es un" motor.
-
Cuando quieres evitar métodos irrelevantes en las subclases. Ejemplo: Un pingüino no necesita un método
volar. -
Cuando necesitas reutilización sin rigidez. Ejemplo: Comportamientos reutilizables como
PuedeNadaroPuedeVolar. -
En sistemas que requieren flexibilidad y modularidad. Al usar composición, obtienes un diseño más modular, flexible y fácil de mantener, eliminando las limitaciones de las jerarquías de herencia rígidas. 😊
3. Diferencias Clave #
| Aspecto | Herencia | Composición |
|---|---|---|
| Relación | "Es un" (is-a). Una clase hereda de otra. | "Tiene un" (has-a). Una clase contiene instancias de otras clases. |
| Acoplamiento | Acopla fuertemente la clase hija a la clase base. | Desacopla las clases, ya que los comportamientos se delegan a componentes. |
| Reutilización | Los métodos de la clase base se reutilizan, pero heredan toda su implementación. | Permite reutilizar comportamientos específicos sin heredar implementaciones innecesarias. |
| Escalabilidad | Difícil de cambiar si la jerarquía de clases crece mucho. | Fácil de extender y modificar agregando o reemplazando componentes. |
| Flexibilidad | Poco flexible, ya que las clases hijas dependen de la estructura base. | Muy flexible, ya que los componentes pueden combinarse de muchas formas. |
Código Malo #
Problema: Heredar
Motorpara unCochees incorrecto.
Solución: Usa composición para manejar comportamientos específicos en lugar de herencia.
Código Bueno
Resumen del tema
Conceptos clave #
- Composición sobre Herencia (Favor composition over inheritance): construir comportamiento complejo ensamblando objetos independientes mediante interfaces en vez de forzar jerarquías de herencia rígidas.
- Flexibilidad en Tiempo de Ejecución: la composición permite intercambiar motores o estrategias dinámicamente sin modificar la clase contenedora.
- Evitar Jerarquías Rígidas: previene la explosión de clases que surge al intentar modelar combinaciones múltiples mediante herencia múltiple o niveles profundos.
Qué debes recordar #
Prefiere componer objetos pasando dependencias polimórficas antes que crear jerarquías rígidas y frágiles de herencia.