jueves, 5 de abril de 2012

Contar líneas de código de un proyecto (SLOC) JEE

 Una forma de medir el tamaño o la complejidad de un proyecto es por la cantidad de líneas de código. (SLOC - Wikipedia)
Existen muchos debates sobre la utilidad real de esta medida, por ej: Cuánta cantidad de esas líneas fueron autogeneradas por wizzards, o cuánto se refactoreó (¿Qué pasa con la cantidad de líneas de código escritas pero reemplazadas?), o cuántas se trajo de otro proyecto, en el caso de proyectos de Software Libre, etc. Como verán, existen varios factores que considerar, por lo que no voy a entrar en demasiados detalles al respecto.
Como tantas cosas en la informática, es una herramienta más, cada proyecto le encontrará su utilidad, según su ambiente.
Comparto un script muy sencillo, que hace uso de herramientas clásicas de un shell Unix, lo desarrollé en Ubuntu 11.04, pero debería funcionar sin muchos cambios en cualquier ambiente tipo Unix.
Como me dedico casi exclusivamente a proyectos de tipo JEE, está orientado a contar los principales tipos de archivos utilizados en dicho desarrollo.
Este script cuenta el total de líneas de código por tipo de archivo, muestra los 10 más extensos y un total general por cada tipo.

-- inicio de  lineas-de-codigo.sh --
#!/bin/bash
#
# Cuenta lineas de codigo de un proyecto JEE
#
# consultas o sugerencias: alefeltes [ en ] gmail [punto] com
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see .
#

#Mostrar como maximo este numero de lineas
MAX_RANKING_TO_SHOW=10
#el primer parametro recibido ó el directorio de los codigos fuentes harcoded
DIR_SOURCE_CODE=${1:-"/home/usuario/svn"}
echo "Directorio: $DIR_SOURCE_CODE"
echo "Mostrando la cantidad de lineas de codigo por archivo y los  \
    $MAX_RANKING_TO_SHOW mas extensos"
echo  "Contamos la cantidad de lineas JAVA"
find $DIR_SOURCE_CODE -name "*.java" | xargs wc -l | sort -n | \
    tail -$MAX_RANKING_TO_SHOW
echo "FIN TOTAL_JAVA"
echo ""
echo  "Contamos la cantidad de lineas XHTML"
find $DIR_SOURCE_CODE -name "*.xhtml" | grep -v .metadata | xargs wc -l | \
    sort -n | tail -$MAX_RANKING_TO_SHOW
echo "FIN TOTAL_XHTML"
echo ""
echo  "Contamos la cantidad de lineas CSS, excluimos los javascript de otros \
    proyectos como el birt, y cia. y también los del Eclipse"
find $DIR_SOURCE_CODE -name "*.css" | grep -v birt | grep -v scriptacu | \
    grep -v bigdecimal | grep -v proto | grep -v .metadata | grep -v platform | \
    xargs wc -l | sort -n | tail -$MAX_RANKING_TO_SHOW
echo "FIN TOTAL_CSS"
echo ""
echo  "Contamos la cantidad de lineas JAVASCRIPT, excluimos los javascript de \
    otros proyectos como el birt, y cia. y también los del Eclipse"
find $DIR_SOURCE_CODE -name "*.js" | grep -v birt | grep -v scriptacu |
    grep -v bigdecimal | grep -v proto | grep -v .metadata | xargs wc -l |
    sort -n | tail -$MAX_RANKING_TO_SHOW
echo "FIN TOTAL_JS"
echo ""

 -- fin de  lineas-de-codigo.sh --

Un ejemplo de la ejecución
afeltes@kate ~ $ ./lineas-de-codigo.sh /opt/desarrollo/sources/mbohape/ 
Directorio: /opt/desarrollo/sources/mbohape/
Mostrando la cantidad de lineas de codigo por archivo y los   10 mas extensos
Contamos la cantidad de lineas JAVA
   694 /opt/desarrollo/sources/mbohape/generador-entities/src/org/ticpy/intercambio/Defunciones.java
  1077 /opt/desarrollo/sources/mbohape/mbohape/src/main/java/org/ticpy/util/BeanUtil.java
  1095 /opt/desarrollo/sources/mbohape/mbohape/src/main/java/org/ticpy/util/GenericUtil.java
  1139 /opt/desarrollo/sources/mbohape/mbohape/src/main/java/org/ticpy/ws/Nacimientos.java
  1308 /opt/desarrollo/sources/mbohape/RemoteWSTestClient/src/org/ticpy/ws/Nacimientos.java
  1364 /opt/desarrollo/sources/mbohape/RemoteWSTestClient/src/org/ticpy/ws/Personas.java
  1371 /opt/desarrollo/sources/mbohape/mbohape/src/main/java/org/ticpy/ws/Personas.java
  1848 /opt/desarrollo/sources/mbohape/RemoteWSTestClient/src/org/ticpy/ws/Defunciones.java
  1854 /opt/desarrollo/sources/mbohape/mbohape/src/main/java/org/ticpy/ws/Defunciones.java
 19590 total
FIN TOTAL_JAVA

Contamos la cantidad de lineas XHTML
  20 /opt/desarrollo/sources/mbohape/mbohape/src/main/webapp/WEB-INF/templates/default.xhtml
  46 /opt/desarrollo/sources/mbohape/mbohape/src/main/webapp/index.xhtml
  60 /opt/desarrollo/sources/mbohape/mbohape/src/main/webapp/persona.xhtml
 126 total
FIN TOTAL_XHTML

Contamos la cantidad de lineas CSS, excluimos los javascript de otros  proyectos como el birt, y cia. y...
40 /opt/desarrollo/sources/mbohape/mbohape/src/main/webapp/resources/css/screen.css
FIN TOTAL_CSS

Contamos la cantidad de lineas JAVASCRIPT, excluimos los javascript de  otros proyectos como el birt, y cia. y...
0
FIN TOTAL_JS