Los riesgos de la herencia: por qué es preferible usar composición

Abstracto

La herencia es uno de los primeros conceptos que se nos presentan cuando aprendemos a programar orientado a objetos. Pero la herencia tiene algunas limitaciones importantes que muchos ignoramos. En esta plática veremos cómo la composición de objetos puede resultar a menudo en una mejor alternativa.

Descripción

Presenté esta plática en inglés en el PyCon USA 2019.

La herencia es uno de los primeros conceptos que aprendemos cuando estudiamos programación orientada a objetos. Pero la herencia trae consigo algunas desventajas y limitaciones que solemos ignorar. La herencia, por su propia naturaleza, tiende a vincular fuertemente una subclase con su superclase. Esto significa que la modificación del comportamiento de una superclase puede alterar el comportamiento de todas sus subclases, a veces en maneras que no anticipamos. Además, es bien sabido que la herencia en rompe la encapsulación. Entonces, si la herencia tiene estos problemas, ¿qué alternativa tenemos? Hace más de dos décadas, la pandilla de los cuatro (Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides) sugirieron en su famoso libro de Patrones de diseño que es preferible favorecer la composición de objetos sobre la herencia de clases.

En esta plática veremos ejemplos de código en Python donde la herencia se descarrila y mostraré cómo corregir esta situación usando composición. Mi intención no es satanizar a la herencia, sino mostrar cómo usarla sabiamente para mejorar el diseño de nuestro software orientado a objetos con el fin de que sea más flexible y fácil de mantener.

Contenido de la plática

  • Acerca de mí (1 minuto)
  • Descripción de herencia y composición (3 minutos)
  • Ejemplo de herencia y composición (2 minutos)
  • El principio de favorecer composición sobre herencia (2 minutos)
  • Reusabilidad de código (1 minuto)
  • Ventajas de la herencia (2 minuto)
  • Desventajas de la herencia (2 minutos)
  • Código ejemplo: Lista encadenada LIFO (1 minuto)
    • Contador de inserciones usando herencia de clases (3 minutos)
    • Contador de inserciones usando composicion de objetos (3 minutos)
  • Ventajas de la composición (1 minuto)
  • Desventajas de la composición (1 minuto)
  • Cuándo utilizar herencia (2 minutos)
  • Elementos a considerar (1 minuto)
    • Distinguir las relaciones es-un de las tiene-un (1 minuto)
    • Combinando herencia y composición (1 minuto)
    • Documentación (1 minuto)
    • Principio de sustitución de Liskov (1 minuto)
  • Conlusión (1 minuto)