domingo, 23 de octubre de 2011

Metadatos en Java: Anotaciones vs XML


Desde que la version 5 del lenguaje Java incorporase las anotaciones, la mayoría de los frameworks Java han proporcionado la posibilidad de introducir meta-datos directamente en el código fuente de nuestras aplicaciones, frente a la estrategia previa de usar ficheros XML de configuración. 

Las últimas versiones de los frameworks Java más populares (Spring, Hibernate, Struts...) permiten anotar el código fuente, de manera que los meta-datos de configuración se encuentran directamente en el código fuente y no en un fichero XML externo. 


Por ejemplo, en Hibernate podemos anotar los POJOs que queremos persistir, o bien podemos incluir meta-datos de configuración en el fichero de mapeo XML:


@Entity
@Table(name="EMPLOYEE")
public class Employee implements java.io.Serializable{
...
}


versus


<class name="Employee" table="EMPLOYEE">
...
</class> 


Está claro que hay dos formas distintas de hacer lo mismo, pero, cual escoger? Las anotaciones presentan una nueva forma de proporcionar meta-datos, pero por ser nueva no quiere decir que sea mejor. 

Personalmente, creo que ambas estrategias tienen sus pros y contras:

  • Anotaciones
    • Pros
      • La aplicación no está acoplada con librerías de parsing de XMLs. Se evitan posibles problemas con las clases encargadas de gestionar la lectura de los ficheros XML de configuración en tiempo de ejecución. Actualmente, prácticamente cada framework incorpora sus clases de lectura y validación de ficheros XML. Esto puede provocar, en tiempo de ejecución, problemas, durante la lectura de los ficheros XML, derivados del orden de carga de clases, en función de la configuración del classpath
      • El proceso de obtención de meta-datos es más eficiente, al estar definido directamente en el código fuente Java. Se evita el costoso proceso de lectura y validación de ficheros XML de configuración.
      • Aumenta la autonomía de los desarrolladores, dado que informan los meta-datos junto al código fuente, evitando así que posteriormente se deban poner en común (en un único fichero XML) todos esos meta-datos. 
    • Contras
      • Los meta-datos de configuración quedan acoplados con el lenguaje Java. Si un framework ofrece varios lenguajes de implementación (Java, PHP, .NET...), debería buscar una estrategia de definición de meta-datos para cada lenguaje, dado que las anotaciones son específicas del lenguaje de programación Java.
      • Los meta-datos definidos mediante anotaciones son compilados, es decir, que se definen en tiempo de compilación. En caso de usar ficheros XML, la configuración se define en tiempo de empaquetado de la aplicación. 
  • Configuración mediante XML
    • Pros
      • Los meta-datos están localizados en un único fichero, de manera que es más fácil hacerse una idea global de la configuración. 
      • La configuración de la aplicación se define en tiempo de despliegue (no requiere compilación) y esto aporta una mayor capacidad de reacción frente a errores en el despliegue de la aplicación (como medida extrema se puede editar el fichero XML de configuración desplegado). 
      • Mayor independencia del lenguaje de programación en el que implementamos el framework (el uso de anotaciones es específico de Java). 
    • Contras
      • En caso de usar una herramienta de control de versiones, el fichero de configuración XML está sujeto a un gran número de fusiones de versiones (merge). 
      • Pueden darse problemas con librerías de parsing de XML en tiempo de ejecución.
      • La carga de la configuración es menos eficiente, y por eso suele realizarse en tiempo de ejecución.  

A modo de conclusión personal, creo que el uso de anotaciones para los meta-datos puede ser una gran decisión para todos aquellos frameworks o aplicaciones que vayan a ser desarrollados únicamente en Java, que no estén sujetas a un gran número de revisiones (por ejemplo, módulos generados automáticamente) y que requieran eficiencia en el despliegue pero puedan asumir un cierto coste de tiempo en cargar la configuración al ser sometidas a la primera petición. 

Para el resto de casos, el uso de ficheros XML para definir los meta-datos de configuración sería una excelente opción, aunque muchas veces, esta decisión de diseño suele tomarse por las costumbres de quien desarrolla y no por motivos objetivos.