Herencia y Patrón Composite | Inheritance and Composite Pattern

Si GO (Golang) es un lenguaje Orientado a Objetos, ¿por qué no existe la herencia como la conocemos en otros lenguajes?

Go, a diferencia de estos lenguajes, no la necesita pues la filosofía de este opta por la composición de estructuras a partir de otras estructuras en lugar de una relación jerárquica descendente; en el caso de la Herencia, una nueva clase puede extender las funcionalidades de otra e incluso, en algunos lenguajes, de varias super-clases, siendo esta nueva clase “hija” de las super-clases que hereda y por tanto pudiendo ser considerada del mismo tipo de dato que cualquiera de ellas.

En el patrón estructural Composite, una nueva estructura puede contener otras estructuras y tipos de dato, haciendo que los métodos y datos de estas sub-estructuras estén disponibles en la que estamos componiendo, es importante señalar que en este caso la nueva estructura no es considerada del mismo tipo que las estructuras que la componen, es decir que, si un automóvil está compuesto de: motor, ruedas y luces, el mismo automóvil no es de ninguno de estos tipos; para solventar las necesidades que esto provoca es que utilizamos las Interfaces para describir el comportamiento de estas estructuras, que en este caso podría decir si el automóvil se mueve, que tanto lo hace y si ilumina el interior y/o exterior. De esta manera podemos definir una estructura encapsulada y autónoma que podría formar parte de otras estructuras sin preocuparnos más que por exportar los datos y métodos necesarios incluso utilizando las interfaces como una especie de validación.

Implementación en Go

Vamos a ensamblar máquinas con diferentes componentes, supongamos que estamos desarrollando un motor que deberá generar personajes aleatorios tomando diferentes elementos que lo dotarán de ciertas características.

Proyecto completo: https://github.com/umarquez/100DaysOfC0D3/tree/master/30-composite-pattern

Estas son las interfaces que definen cada componente:

Finalmente nuestra función main():

Salida del programa:

Palabras finales

Es importante entender la filosofía sobre la que se diseñaron las herramientas que utilizamos, esto nos ayuda a aprovechar cada característica de una mejor manera pues entenderemos mejor la visión general y la manera en que fue abordada cada situación.

Ahora que conocemos un poco más la diferencia entre herencia y composición podremos entender mejor el código que alguien más escribió, además de mejorar la manera en que organizamos nuestras estructuras, especialmente si venimos de lenguajes que no funcionan exactamente de la misma forma; no solo se trata de traducir código pues muchas veces esto nos puede acarrear más problemas de los que solucionaríamos.

Me gustaría conocer tu opinión acerca de los temas que vamos tratando en esta serie o si tienes alguna sugerencia o idea que te gustaría que exploremos; puedes dejar tus comentarios en este mismo artículo o en cualquiera de las redes sociales.