Uso de las interfaces de Java
Buscando el por qué de los interfaces.
Fecha de creación: 15.05.2001
Revisión 1.0.1 (15.10.2002)
Alberto Molpeceres
al AT javahispano DOT org
|
Introducción
Hace no demasiado tiempo fuí a una entrevista de trabajo como desarrollador Java. Como programador con relativa experiencia en Java pensaba que todo estaría bajo control en la parte técnica. Me equivoqué.
Una de las preguntas que me hicieron fue: ¿cuando usas interfaces y cuando herencia a la hora de diseñar software?. Realmente no me lo esperaba, hasta ahora para mi era una cuestión de intuición (al igual que para muchos otros) más que un tema racional. Solo acerté a a explicar las diferencias entre una cosa y otra, con los nervios ni tan siquiera me vino a la cabeza la mas conocida de todas las razones, la herencia múltiple, y mi interlocutor dijo que el también conocía el lenguaje, pero que quería saber el por qué.
Como tenía intención de cambiar de trabajo, quería preparame mejor para el resto de las entrevistas, y aunque fuera poco probable que me volvieran a hacer la misma pregunta, como cuestión personal, decidí buscar mi propia respuesta a este tema, y aquí estoy, contando lo que he encontrado.
Herencia.
Como he dicho antes, la primera y más conocida función del uso de interfaces es la de resolver el problema de la herencia múltiple presente en otros legunajes, como por ejemplo C++. Los interfaces de Java, al separar la forma del como (la declaración del código que lo implementa) permiten la herencia multiple sin los problemas típicos que se pueden plantear para decidir que implementación usar cuando una clase hereda de dos que tienen implementaciones distintas para la misma signatura de un método. Esta claro que tampoco es una solución mágica (simplemente no se herda el código, asi que no hay que decidir cual se coge), pero es una solucióón. Pero esta no podría ser la única razón para el uso de interfaces, ya que tampoco es la más usada (en realidad se usa bastante poco si exceptuamos componentes gráficos que implementan varios interfaces de oyentes de eventos). Además, los "manuales de la buena programación" dicen que los interfaces son para modelar las relaciones tiene un, no es un, aunque esto no siempre se así.
Polimorfismo.
Asi que me puse a pensar en las ocasiones en que yo he usado interfaces. La respuesta era fácil, cuando necesita cierto polimorfismo, es decir, cuando necesitaba que una clase pudiera tener con los mismos métodos o atributos distintos comportmientos, por ejemplo, una clase que pudiera almacenarse en una base de datos o en un fichero de texto sólo cambiando el objeto que la hace persistente. Siempre que todos implementen el mismo interface, la clase puede almacenarse en cualquier tipo de dispositivo sin cambiar los métodos necesarios. Algunos dirán que esto se podría hacer de la misma forma con algunas jerarquías de herencia, pero en mi opinión de esta forma el código es mucho más flexible a la hora de añadir funcionalidad a la aplicación (por no mencionar la de if
que se quitan). Ya tenía dos razones.
Diseño.
Entonces, viendo el funcionamiento de algunos grandes proyectos caí en una tercera razón, que quizas tiene menos que ver con la programación en primera instancia, pero que es de enorme importancia para el diseño (para el buen diseño) de aplicaciones. Los interfaces de Java son (o pueden ser) el contrato entre distitnas partes de una aplicación, o entre los distintos programadores de una aplicación.
Si se discuten y diseñan unos buenos interfaces entre los distintos componentes de la aplicación en la primera parte del desarrollo, los diferentes grupos de trabajo pueden trabajar en paralelo sin tener que preocuparse de lo que hacen o ya han hecho el resto, y para los test es bastante facil escribir un par de clases de prueba que implementen esos interfaces. De esta forma, la intergración entre las distintas partes de la aplicación ya esta hecha desde un principio, sin tener que andar consultando de que métodos se dispone para llevar a cabo una labor, y los grupos de desarrollo se solo tienen que preocuparse de que la implementación de su parte sea el orgullo del proyecto ;-).
Además, el uso de interfaces, debido a la propia naturaleza de Java, hace que sea tremendamente fácil encontrar las clases que se ven afectadas por una cambio brusco en alguna parte de la aplicación, ya que lo hará el compilador sólo.
Conclusión
Y eso es todo lo que se me ha ocurrido (herencia, polimorfismo y diseño), por ahora me he quedado satisfecho, en la próxima entrevista ya tendré claro que contestar, pero espero que todo aquel que tenga nuevas ideas para el uso de interfaces me las haga llegar.
Recursos
Acerca del autor
Alberto Molpeceres
Alberto es es ahora mismo desarrollador de aplicaciones en ámbito cliente/servidor para la empresa T-Systems - debis Systemhaus en Munich (Alemania). Cuando no está trabajando o "metiendo caña" al resto de los integrantes de javaHispano intenta pasear con su novia, buscar la desaparecida lógica del idioma alemán o intentar olvidar la pesadilla que es buscar piso en Munich.