Más de una vez (y de dos) he oído hablar sobre extrañas normas no escritas (o eso espero) sobre «buenas prácticas» de programación. De entre todas ellas, me permito destacar:

  • El break solo se puede usar en los switch (en cada case).
  • Usar el continue es un pecado capital, al infierno de cabeza.
  • El return solo puede ir en la última línea de una función o método, y únicamente para retornar algo. De lo contrario sufrirás indecible tormento.
  • Y la clásica: Usar el goto está penado con sufrimiento eterno.

Por curiosidad le he estado echando un vistazo a OpenJDK, que es la implementación de Java que liberó Sun no hace tanto (y de la que sigue siendo propietario). El código es en su mayoría Java, C y C++. He sacado unos números (no me atrevo a decir métricas) sobre el directorio source/openjdk/jdk/src. Conste que esto es muy burdo y que no he hecho ningún tipo de filtrado, así que los números reales pueden variar bastante, aunque creo que sirven para hacerse una idea aproximada.

Primero un cálculo de LOC, para saber de qué cantidad de código estamos hablando.

$ sloccount *
SLOC	Directory	SLOC-by-Language (Sorted)
1521726 share           java=1269400,ansic=226529,cpp=25724,cs=72,sh=1
230177  solaris         ansic=158218,java=71765,asm=157,sh=21,awk=16
100139  windows         cpp=53140,ansic=24593,java=22406
0       linux           (none)

Totals grouped by language (dominant language first):
java:       1363571 (73.63%)
ansic:       409340 (22.10%)
cpp:          78864 (4.26%)
asm:            157 (0.01%)
cs:              72 (0.00%)
sh:              22 (0.00%)
awk:             16 (0.00%)

Total Physical Source Lines of Code (SLOC) = 1,852,042

Y unos “grep’s” con resultados curiosos:

$ grep -R "switch (" *  | wc -l
2251
$ grep -R "case " *  | wc -l
18609
$ grep -R "break;" *  | wc -l
11232

No es fácil saber si esos break’s corresponden todos a esos case. El siguiente dato demuestra que al menos hay algunos que no se usan únicamente para terminar un case. Esto solo cuenta aquellas sentencias en el que el if y el break están en la misma línea. Echando un vistazo al código es fácil encontrar break dentro del bloque de un if o else pero eso no es tan fácil de contabilizar con grep.

$ grep -R "if" * | grep "break;" | wc -l
201

Y por último:

$ grep -R "continue;" *  | wc -l
1600
$ grep -R "goto " * | wc -l
447
$ grep -R "return" * | wc -l        
133092

Contabilizar el número de funciones y métodos no es nada fácil, por lo que no es fácil saber si hay más de un return por función. Sin embargo, el siguiente dato deja claro que al menos utilizan bastante return para terminar “contranatura” funciones y métodos void:

$ grep -R "return;" * | wc -l
6800

Y lo mismo que dije del break es aplicable para detectar el uso de continue y return en una sentencia condicional:

$ grep -R "if" * | grep "return" | wc -l
11913
#  grep -R "if" * | grep "continue;" | wc -l
239

Prometo refinar estos números cuando tenga tiempo.

Conclusión: La gente de Sun no tiene ni idea de programar…



blog comments powered by Disqus