14 mayo 2010

Programar una Interface vs implementación

Principio: Programar una Interface en lugar de una implementación (Code to an interface rather than to an implementation).

Para entender claramente este principio veamos primero que es Polimorfismo. El polimorfismo esta muy relacionado con la herencia, cuando una clase hereda de otra entonces el polimorfismo permite a una subclase sustituir a la superclase.

Lo que permite el polimorfismo  es retardar la decisión sobre el tipo del objeto hasta el momento en que vaya a ser utilizado el método. En este sentido, el polimorfismo está asociado a lo que se denomina vinculación tardía o vinculación en tiempo de ejecución.

La idea es que los objetos de distintas clases que hereden de una clase en común puedan ser tratados de la misma manera, y se le apliquen los mismos mensajes (tengan la misma interfaz), aunque las implementaciones particulares sean diferentes.

Veamos un ejemplo para entender de una manera mas clara.

 
Imaginemos que tenemos una interface (o una clase abstracta) llamada Animal que tiene definido un método llamado hacerSonido(), Animal tiene dos implementaciones concretas Perro y Gato, sin aplicar Polimorfismo tenemos que Programar una Implementación:

Perro p = new Perro();
p.hacerSonido();

Declarando la variable p como de Tipo Perro (Una concreta implementación de Animal) nos obliga a codificar una concreta implementación.

Pero con ayuda del polimorfismo podemos Programar una Interface:

Animal a = new Perro();
a.hacerSonido();

Sabemos que el método hacerSonido lo ejecutara un objeto de tipo Perro  pero ahora podemos utilizar la referencia a para aplicar el polimorfismo.

Si añadimos a nuestro código anterior las siguientes líneas:

Animal a = new Perro();
a.hacerSonido();
a = new Gato();
a.hacerSonido();

Ahora el método hacerSonido lo ejecutara un objeto de tipo Gato.


Aún mejor, en lugar de definir la instancia del subtipo new Perro() ó new Gato() como en el código anterior, asignamos la implementación concreta del objeto en tiempo de ejecución:

Animal a = getAnimal();
a.hacerSonido();

Ahora no sabemos de que tipo es Animal , ya que lo único que nos preocupa es saber que responderá de forma correcta al método hacerSonido().

Programar una interface en lugar que una implementación logra que nuestra aplicación sea más fácil de extender y nuestro código funcione con todas las implementaciones de esa interface, aún con ellas que aún no han sido creadas.

No hay comentarios:

Publicar un comentario