El increíble y flexible mecanismo de las interfaces y la desalmada costumbre de no usarlas


Si es increíble que en muchos diseños de software no se utilice el concepto de interfaz cuando es un mecanismo que permite «abstraer» propiedades genéricas de un modelo y que por lo mismo permite «factorizar» código, lo que a su vez lo reduce; pero más importante aún, da mayor flexibilidad al código. Y este artículo es precisamente una explicación de esa flexibilidad.

Imagínate por un momento que estás diseñando un programa de dibujo, digamos algo parecido a Dia Diagram Editor (en el siguiente enlace puedes bajarte una versión portable, esto es, que puedes instalar en una memoria USB y completamente legal,  Dia Portable). Este es un programa que puede dibujar líneas, rectángulos, óvalos y otras figuras, pero lo más importante es esto último, que puedes añadirle librerías de nuevas figuras sin necesidad de recompilar el código. ¿Cómo se hace esto? Muy sencillo, con la herencia y particularmente usando las interface.

Una aclaración, utilizo el nombre en Java, interface, para no confundir con las interfaces con el usuario y también por que es exactamente ese concepto el que estoy abordando aquí.

Pero antes de seguir con el ejemplo, es importante decirte que las interface es una implementación del importante concepto de separación interfaz-implementación del que ya te conté en el artículo El antiguo pero siempre actual concepto de separación interfaz-implementación, por lo que si quieres saber lo importante y flexible del concepto te recomiendo que leas el artículo primero.

Pero volviendo a nuestro ejemplo te presento una primera versión del diseño del programa, pero sin usar interface.

Modelo de un programa de dibujo sin interfaces

Modelo de un programa de dibujo sin interfaces

Como siempre, si no puedes ver los detalles sólo haz clic en el gráfico para verlo, y se hace clic otra vez, y tienes una navegador basado en mozilla, puedes ampliarlo. El «fuente» de este modelo lo puedes bajar en Interfaces diseño engorroso, está hecho en Modelio un modelador de UML libre y gratis.

En este diseño se tienen tres figuras básicas: línea, rectángulo y óvalo, pero se insinúa que pudieran haber otras figuras, pero solo puede tener un número de figuras fijo. Examinemos la clase Dibujo que es la encargada de contener todas las figuras de un dibujo. Mira que tiene varias operaciones add ¡Uno por cada figura! y eso que la lógica es la misma para cualquiera de las figuras. Y eso no es lo peor, si queremos tener veinte tipos de figuras distintas, pues hay que hacer veinte operaciones add. También tendríamos que hacer veinte operaciones seleccionar y veinte del y veinte setTexto y así con cada operación. Y eso a a pesar de que todas tienen el mismos código. Esta es una repetición innecesaria de código.

Y esto todavía no es lo peor, lo peor es que si queremos añadirle nuevas figuras tocaría modificar la clase Dibujo cada vez que se hacen nuevas figuras !y recompilar todo el código! Y un programa como Dia tiene más de mil figuras que le han estado añadiendo a través de los años. Es totalmente impráctico.

Pero continuemos, si miras las clases de figuras (Línea, Rectángulo, Óvalo y OtraFigura), verás que he marcado varias operaciones en rojo y todas estas operaciones son iguales en todas las figuras. Esto quiere decir que todas ellas pueden «factorizarse» mediante una herencia. Pero no es cualquier herencia, pues resulta que si, todas tienen la operación dibujar, pero dibujar una línea es muy diferente de dibujar un óvalo. Lo que es común es sólo el encabezado de la operación (la interfaz), pero el cuerpo de cada una es distinta (la implementación). Y es precisamente cuando se quiere factorizar solo los encabezados de operación cuando se usa el concepto de interface.

Veamos una nueva versión del diseño de nuestro programa de dibujo con el concepto de interface.

Modelo de un programa de dibujo con interfaz

Modelo de un programa de dibujo con interfaz

El «fuente» de este modelo lo puedes bajar de Interfaces: diseño con interfaz.

Recordemos que una interface es como una clase, pero que no tiene atributos y que sólo tiene los encabezados de operaciones, sólo tiene sus interfaces. Entonces la interface Figura tiene justamente sólo eso, las interfaces de las operaciones. Realmente lo que hace Figura es definir como debe ser la interfaz de cualquier figura. Esto quiere decir que cualquier clase que implemente a Figura tiene que obligatoriamente implementar los métodos que aparecen en Figura, esos son los casos de las clases Línea, Rectángulo y Óvalo, por ello marqué estas operaciones en rojo.

Pero antes de todo mira como ha quedado la clase Dibujo, ¡Se ha simplificado mucho! Ahora sólo se tiene una operación add, una sola de cada una de las que antes estaban repetidas. Y es que pensándolo bien es lo mismo agregar una línea a un dibujo que agregar un óvalo, es el mismo código. Con las otras operaciones pasa lo mismo (seleccionar, del y setTexto) se simplifican en una sólo operación que aprovecha que todas la figuras heredan de la interfaz Figura.

Y este último es el centro de todo, interfaz Figura que abstrae todo el comportamiento que debe tener cualquier figura. Recuerda que una interface es parecida a una clase, pero tiene, o mejor no tiene dos características: La primera no tiene atributos. La segunda todos los métodos son abstractos y un método abstracto es aquél que no tiene cuerpo, o sea, el que no tiene sentencias. ¿Entonces para que sirve si no hace nada?

Pues muy sencillo, para definir un conjunto de métodos que tienen que tener un grupo de clases. En nuestro ejemplo, el conjunto son las clases de tipo figura y los métodos dibujar, estaDentro y todas las demás que están en rojo. Y con ello no sólo podemos simplificador dibujo, sino hacer que la aplicación pueda extenderse fácilmente, como en el Dia Diagram Editor.

Otra ventaja, es cuando se tiene un equipo de desarrollo y se quiere que las clases que escriban diferentes desarrolladores cumplan con una interfaz definida, pues muy sencillo, se les dice que tienen que implementar una interface, en nuestro ejemplo que tienen que implementar Figura.

Finalmente las interface tienen ese nombre por que son la forma en que java implementa el principio separación interfaz-implementación y ya vimos en ese artículo las ventajas que tiene diseñar de esa forma.

Así qué, usa las interface.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: