sábado, 23 de marzo de 2013

Herencia Multiple en PHP



La herencia simple

Es la que tienen todos los lenguajes orientados a objetos: heredamos los atributos de una sola clase padre, lo cual nos permite reutilizar código. Si fuera herencia múltiple, podríamos heredar de más de un padre.

Ejemplo de como se codificaría

La herencia múltiple, si fuera implementada en PHP, se codificaría de la siguiente manera:


class C extends A,B{
  // código
}


Donde la clase C hereda atributos y/o métodos de dos clases, A y B.

Por ejemplo, la clase "HombreLobo" puede heredar de la clase "Hombre" y de la clase "Lobo", pero el problema es que se pueden hacer tantas combinaciones que será difícil seguir y mantener un diseño de este tipo. Por eso muchos lenguajes no la implementan, no por un tema técnico, solo por un tema de salvaguardar la integridad del diseño.

¿Se puede hacer o no?

Por lo que he visto en varios lenguajes, la discusión legítima no es "si se puede hacer o no". En muchos casos no se implementa (como en Java, PHP, etc) porque habilitarla es un posible camino al desastre.

Verdaderamente no es problema técnico, o de evolución, es un problema de criterios de diseño "OO".

Herencia múltiple a través de interfaces

De todas formas siempre hay una puerta trasera: hacer herencia múltiple a través de interfaces; pero el sentido es distinto a hacerlo con clases. Las herencias de clases definen el "que son" y las interfaces agrupan clases que definen el "que hacen".

Las interfaces permiten pasar del estilo de diseño "orientado a la implementación" a uno "orientado a la interfaz", donde todas las clases acceden a servicios a través de interfaces que son implementadas por clases concretas. Y al no depender de clases concretas (solo de entidades abstractas) nuestro diseño será más reutilizable que el anterior.

El mayor problema

Los problemas más comunes que puede dar la implementación de herencias múltiples son las "colisiones de nombres" y la "herencia repetida".

Las colisiones se pueden dar cuando las clases empiezan a tener los mismos nombres en los métodos generando la duda de cual método debo usar de las dos clases y la herencia repetida es cuando nuestra clase hereda de dos clases que a sus vez son hijas del mismo padre, por lo cual estemos posiblemente heredando características repetidas.

¿Que sugieren las "Guias de Diseño OO"?

Y ya que estamos del tema "diseño", lo comento: las guías de diseño recomiendan que para una buena jerarquía de herencia:

- Se deben tener no más de 7 (+-2) niveles
- Las jerarquías "gordas y bajas" son síntoma de "poca especialización"
- Las jerarquías "altas y flacas" son síntoma de "excesiva especialización".

¿Si tantas recomendaciones existen para la herencia simple, que queda esperar para la herencia múltiple?

¿Y los grandes libros de Patrones de Diseño?

Hasta yo puedo crear un patrón y usar la herencia múltiple, pero eso no quiere decir que sea la mejor solución a un problema, ni que este pueda aplicarse en otros contextos (la esencia de los patrones).

Tomando como referencia un libro base reconocido mundialmente como es el GOF , donde ninguno de los patrones (de los 23) hacen uso de la herencia múltiple, y tampoco la sugieren, y menos, se quejan de su falta.

Los patrones de diseño son considerados la mejor "receta de cocina" para resolver un problema recurrente, con el mejor diseño posible, donde puede ser aplicado en otros contextos (concepto de patrón: "elemento reutilizable de experiencia y conocimiento").


0 comentarios:

Publicar un comentario



 
contador de visitas