Programación Orientada a Objetos · Programación

Composición sobre herencia

Preferir composición sobre herencia para reutilizar comportamiento y acoplar menos los componentes de un sistema.

Composición sobre herencia

Ilustracion de programacion orientada a objetos: jerarquia de clases con herencia y encapsulamiento.
Principios de la programacion orientada a objetos: clases, herencia y polimorfismo.

Mapa conceptual

Tener es mejor que ser No toda reutilización debe ser una jerarquía. Si un Coche solo quiere «usar» un Motor, que lo TENGA como parte, no que HEREDE de Motor. La composición une piezas; la herencia encadena destinos.

Herencia encadena

Con herencia, la subclase queda rígidamente unida al padre: comparte su implementación, y si el padre cambia, el hijo se entera. Es útil para verdaderos «es-un», pero frágil cuando se usa solo para reutilizar: un cambio lejos puede romper todo el árbol.

Composición une

La composición construye un objeto teneniendo otros como partes y delegando en ellos. Un Coche tiene un Motor y le pide que arranque. El motor se puede sustituir, apagar o probar a parte sin tocar al coche. La relación es flexible y visible.

La regla de oro

El principio de diseño «prefiere composición sobre herencia» dice: cuando dudes, no heredes para reutilizar; crea un objeto interno y delega en él. Reserva la herencia para cuando la relación es-un sea genuina y estable.

Cuando solo buscas reutilizar, la composición casi siempre gana.
CriterioElige herenciaElige composición
Relación reales-un genuino y establetiene-un / usa-un
Flexibilidadjerarquía fijapiezas intercambiables
Acoplamientohijo depende del padrebajo, por interfaz
Reutilizarcomportamiento base comúncompartir funcionalidad
Polimorfismosustituir tiposinyectar componentes

Un Coche necesita reutilizar la funcionalidad de arranque de un Motor. ¿Qué relación conviene?

Delegación

El objeto contenedor expone su propia interfaz pero reenvía parte del trabajo a sus componentes. Así se pueden intercambiar piezas en tiempo de ejecución (otro motor, otro formato de salida) sin recompilar jerarquías.

Testeabilidad

Con composición puedes meter un motor falso (un stub) en el coche para probarlo sin encender el motor real. El bajo acoplamiento hace que las unidades se puedan aislar y verificar por separado.

El problema del yo-yo

Las jerarquías profundas obligan a saltar entre padre, abuelo y subclase para entender qué pasa: es el «problema del yo-yo». La composición aplana: cada objeto dice claramente qué partes tiene y a quién delega.

La composición suele producir un acoplamiento más bajo entre componentes que la herencia profunda.

Errores frecuentes

Trabajo en equipo de objetos

Sistemas grandes se ven mejor como constelaciones de objetos que se pasan mensajes y colaboran, no como árboles genealógicos. La composición modela esa colaboración con claridad; la herencia, el parentesco.

Asigna cada relación a la técnica apropiada:

Herencia
Composicion

Wikipedia
Composición sobre herencia: el principio y sus motivaciones.

Tienes un sistema que heredó de «Base de datos» solo para reutilizar un método de conexión. Refactóralo mentalmente a composición: ¿qué objeto inyectarías y qué beneficio obtendrías?

Python: Classes
Tutorial oficial de clases en Python 3.