Caos invisible – dominando los espacios en blanco en Eclipse

19/11/2014

Eclipse Ico
¿Alguna vez has ojeado el código fuente Java de un colega que contenía una mezcla de espacios y tabuladores para la indentación, haciendo el código completamente ilegible? ¿O alguna vez has intentado comparar dos versiones de un fichero Java donde han cambiado los finales de línea, ofuscando la única línea de código que realmente ha cambiado? Esta entrada muestra un modo de dominar el infierno de los espacios en blanco a la hora de desarrollar con Eclipse.

Tabuladores frente a Espacios

Indentar el código fuente con tabuladores o con espacios es uno de los asuntos más discutidos en el mundo del desarrollo de software. No importa si eres un aficionado a los tabuladores o un entusiasta de los espacios, de lo que te deberías asegurar es de que tu método de indentación seleccionado se utiliza de modo consistente en tu proyecto.

Crear código limpio

Lo primero que deberías configurar es el caracter/es que se debería insertar al indentar. Existe una opción en Preferences bajo General-Editors-Text Editors (Insert spaces for tabs) pero esta no se aplica al editor de código fuente Java. Para Java, esto lo gestiona el formateador Java, disponible en Preferences bajo Java-Code Style-Formatter. Puedes utilizar cualquiera de los perfiles existentes (por ejemplo Java Conventions) y pulsar en Edit…:

Eclipse Java Formatter Dialog

Vete a la pestaña Indentation:

Eclipse Java Formatter Indentation Dialog

  • El campo Tab policy (política de tabulación) permite seleccionar entre Tabs only (solo tabuladores), Spaces only (solo espacios) y Mixed (mezclado). No recomendaría mezclar tabuladores y espacios, deberías decidirte por uno de ellos.
  • Cuando seleccionas Spaces only, también deberías decidir un Indentation size (tamaño de indentación) – esto es el número de espacios que se insertarán para representar un nivel de indentación. Si pulsas la tecla Tab (tabulador) de tu teclado dentro del editor Java, se remplazará por un número de espacios, de acuerdo a la indentación que has configurado.

Esta política de indentación se aplica automáticamente si

  • creas nuevas líneas,
  • indentas con Source-Correct Indentation o
  • formateas con Source-Format.

Para asegurarte que todos los fichero que editas tienen automáticamente la indentación correcta, puedes configurar Eclipse para que ejecute el formateador de código justo antes de cada vez que salvar un fichero Java. Simplemente vete a Java-Editor-Save actions en Preferences de Eclipse y marca el check box Perform the selected actions on save y Format source code:

Eclipse Java Editor Save Actions Dialog

Limpiando código antiguo

Hasta ahora hemos conseguido que todos los ficheros Java que creemos o editemos estén limpios. ¿Pero qué ocurre con el código antiguo existente?
Es sencillo una vez que el formateador contiene la política de indentación adecuada. Selecciona en el explorador de proyectos todos los proyectos cuya indentación deseas actualizar. Ejecutando Source-Format del menú principal de Eclipse se aplicarán las configuraciones del formateador de forma recursiva en todos los artefactos, reparando así las indentaciones incorrectas.

Buscando a los renegados

Ya tenemos la base de código limpia pero ¿cómo nos podemos asegurar de que siga así?
Para averiguar que ficheros violan la convención del caracter de indentación utilizado, se pueden utilizar herramientas de análisis estático de código como Checkstyle.

Con eclipse-cs, el plug-in de Eclipse para Checkstyle, se pueden detectar y marcar como problemas en Eclipse de forma sencilla los caracteres de indentación incorrectos.

  • Para detectar los tabuladores ilegales, simplemente activa la regla Whitespace-File Tab Character en las preferencias d Eclipse para checkstyle:
    Eclipse-CS Configuration Dialog
  • No existen un regla por defecto para detectar los espacios ilegales usados para indentar. Afortunadamente es bastante sencillo crear una regla personalizada para checkstyle. Mark A. Ziesemer ha propuesto una regla checkstyle para la detección de espacios iniciales en su blog.

Finales de línea

La discusión de los finales de línea no genera tanta controversia como los tabuladores contra los espacios, pero es igual de frustrante si no se gestiona consistentemente en un proyecto. Tener un consenso para los finales de línea es especialmente importante si se utilizan entornos de desarrollo en diferentes sistemas opertativos. Ya que Eclipse utiliza por defecto los finales de línea de la plataforma en la que se ejecuta, el código fuente escrito en Unix / Mac OS utiliza line feed (LF) (avance de línea), mientras que la instalaciones de Eclipse en Windows producen carriage return (retorno de carro) Y line feed (avance de línea) (CRLF).

Crear código limpio

Una vez convenido un final de línea a utilizar en tus fichero, debes indicárselo a Eclipse. Vete a Preferences y selecciona General-Workspace. El campo New text file line delimiter determina el final de línea a utilizar para los nuevos ficheros Java creados.

Eclipse Preferences Workspace Dialog

Limpiando código antiguo

Cuando trabajamos con código antiguo que tiene delimitadores de línea incorrectos o incluso mezclados, Eclipse ofrece una estupenda posibilidad de rectificar todos los delimitadores de línea de una sola vez. Simplemente selecciona en el explorador de proyecto todos los artefactos que deseas convertir y selecciona File-Convert Line Delimiters To, con el fin de línea de tu elección. Esto realizará una actualización en bloque de todos los artefactos seleccionados.

Buscando a los renegados

Para detectar el uso de delimitadores de línea incorrectos, podemos usar de nuevo Checkstyle. La regla correcta la podemos encontrar bajo Miscellaneous y se llama New Line At End Of File. Permite configurar el final de línea correcto – todas las ocurrencias de otros finales de línea se marcarán como problemas.

Eclipse-CS Configuration Dialog

Repositorios de código fuente

Si almacenas tu código fuente en un repositorio, ten en cuenta que algunos tienen su propio modo de trabajar en cuanto a limitadores de línea se refiere. Por nombrar algunos ejemplos:

  • Por defecto, el plug-in CVS de Eclipse convierte todos los finales de línea de los ficheros de texto a finales de línea de la plataforma.
  • Subversion permite fijar la propiedad svn:eol-style en un fichero, influenciando en los finales de línea del fichero cuando se hace un check out.
  • Git ofrece una opción denominada core.autocrlf que hace que Git convierta los finales de línea durante un commit y/o checkout.

Si estas características de tu repositorio de código fuente están activas, asegúrate de que coinciden los la configuración de tu workspace. No hemos ganado nada si todos los ficheros Java de tu workspace tienen LF como final de línea pero Git está configurado para convertirlos en CRLF cuando los vuelves a recuperar.

Distribuye la configuración

Evidentemente, todos los entornos de desarrollo usados en tu proyecto deberían utilizar las configuraciones realizadas arriba. La configuración de checkstyle y del formateador de código Java se puede exportar a un fichero y puede ser compartida vía repositorio de código fuente. En cuanto a las preferencias de Eclipse: la exportación de preferencias ofrecida por Eclipse solamente cubre una parte de la configuración realizada, desafortunadamente no cubre las que nosotros hemos realizado. La configuración se debe realizar manualmente. Alternativamente se puede utilizar una herramienta de provisionamiento como Yoxos que soporta la distribución automática de las preferencias de Eclipse en un equipo.

vía

Responder

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. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: