CSI XVIII: Los húngaros nombran con prefijos
El reciente post acerca del nombre de nuestras futuras (o muy presentes) cerveceras dio paso, de forma natural, a pensar de qué modo llamaríamos a nuestros productos. Ya lo comenté en el blog de Chela: me gustan los nombres relacionados con la música y hay muchos donde elegir en las anotaciones de las partituras, en latín, italiano o nuestra lengua: Ad Libitum, para la cerveza tomada a la velocidad que uno quiera. Tornada (estribillo), si la cerveza es para ser tomada una y otra vez, Ritardando, para tomar despacio...
El nombre de las cosas es importante. Y, como la mayor parte de cosas importantes, suelen dar problemas. Y en informática, el nombrado de variables puede suponer todo un reto, especialmente porque cuando se hace sin cuidado puede llevar a errores de programación, cuando no a imposibilitar que cualquier otra persona entienda el código (código inmantenible).
Por cierto, una variable no es más que un espacio en memoria destinado a albergar, en algún momento durante la ejecución del programa, algún valor. Necesitamos darle nombres para hacer referencia a ese valor. Así que, ¿qué nombre les ponemos?
El caso es que no vale el primero que se nos ocurra. MaryPoppins, por ejemplo, no vale. Porque luego tienes que operar con estas variables y en el código te pueden aparecer cosas como:
PedidoOctubre = MaryPoppins[3] * OdioAMiJefe;
Eso es código inmantenible. Una risa, si no te fuera el trabajo en descifrarlo y entenderlo.
Por ello todos debemos estar de acuerdo en que el nombre de las variables debe dar pistas acerca de qué tipo de almacén estás gastando para esa variable, qué es lo que deseas guardar en ellas o qué intención tienes al emplearla. Como llamar AldolfoHitler a tu hijo: el nombre da pistas.
Las empresas serias definen una serie de reglas a la hora de escribir programas: son los coding standards (o guía de estilo). Son simples convenciones para que -entre otras cosas-, con independencia de las personas que hayan pasado por la empresa, el mismo estilo perdure. Las convenciones pueden ayudar en el problema de nombrer variables, imponiendo una serie de reglas. Algunas de ellas están muy extendidas y las emplean la mayor parte de programadores en diversos lenguajes. por ejemplo, llamar i, j, k a las variables dentro de un bucle.
Una de las Cosas que Sí se estudió en Informática es la notación húngara. La notación húngara fue creada por Charles Simonyi, uno de los grandes programadores y reciente turista espacial1. La notación húngara se caracteriza por anteponer al nombre de la variable un prefijo que nos da pistas acerca del tipo de variable que estamos empleando. El tipo de variable es la forma del almacén que estamos gastando para guardar su valor.
No voy a a explicar demasiado, porque esto da para otro post: me contentaré con poner algunos ejemplos sencillos. Una variable de tipo carácter está pensada y tiene el espacio asignado para guardar un carácter. Una variable que fuera de tipo cadena tendría un almacén asignado para almacenar una cadena de caracteres.
Entonces, si queremos almacenar un carácter en nuestro programa para guardar la preferencia de un usuario (que lo introduce mediante el teclado), declaramos una variable llamada UserOption y si empleamos la notación húngara, lo hacemos así:
caracter cUserOption;
Mediante esta linea le decimos al compilador (que es típicamente quien traduce nuestro programa a la máquina) que en algún momento tendrá que reservar un hueco en memoria para almacenar una variable de tipo caracter y que se llamará cUserOption. La 'c' usada como prefijo nos recuerda, cuando realizamos operaciones con esta variable, que se encuentra almacenada como un carácter.
La notación húngara tiene cierto sentido cuando, al operar entre variables de distinto tipo, podemos obtener problemas o resultados indeseados. Y justamente, el hecho de que se produjeran tantos errores al operar entre variables de distintos tipos dio lugar a la creación de los lenguajes fuertemente tipados, en los cuales el compilador impide realizar esta clase de operaciones. Así que la notación húngara dejó de tener sentido para muchos programadores.
Otra versión de la notación húngara sugiere que el prefijo debe estar más relacionado con la función que la variable va a cumplir que con el tipo de almacenamiento. Esta versión del invento cuenta con más adeptos, ya que no ha perdido el sentido al reforzar los compiladores el análisis de tipos. Algunos ejemplos de este uso son:
numeroentero nSandias;
Que informa al compilador de que debe guardar un espacio para almacenar un número entero. En ese espacio guardaremos el número de sandías de nuestra aplicación. De ahí el prefijo 'n'. Pero como si no hay guía de estilo, nadie tiene por qué saber que 'n' es de 'número' en vez de 'nuevas', pues resulta que la notación húngara sigue sin ser ninguna panacea.
Esta notación, sin embargo, se sigue empleando... y mucho. Porque Charles Simonyi fue fichado por Bill Gates y la notación húngara pasó a formar parte intrínseca de las aplicaciones de Microsoft, incluyendo su Sistema Operativo más popular. En los últimos tiempos, sin embargo, hasta los de Redmond se desdicen y recomiendan no emplear este sistema de nombrado en el código.
Recordar la notación húngara de prefijos me ha recordado otras notaciones algebraicas, que también tienen que ver mucho con la informática. Me refiero a la notación polaca (o infija) y a la polaca inversa (o postfija). Rápidamente:
* + 3 2 5 --- Es lo mismo que antes en notación polaca. Lo inventó un polaco.
3 2 + 5 * --- Es lo mismo, pero en polaca inversa.
De los tres, el más útil y divertido es el de polaca inversa. Útil para algunas calculadoras, claro. Polaca y polaca inversa no precisan de paréntesis, ni de conocer las reglas de precedencia (no hay expresiones ambiguas). Eso le viene muy bien al informático para realizar cálculos. En polaca inversa, cada vez que se encuentra un operador, se realiza el cálculo indicado: los operados habrán sido leídos anteriormente (o hay un error en la expresión).
La polaca inversa tiene desventajas. Los espacios en las expresiones son de vital importancia para no confundir la expresión. Y como no se enseña en las escuelas ni se aplica sobre el papel, su uso está muy limitado.
Pero sirve para entender el chiste de arriba (cortesía de xkcd, como no). Ante ustedes, ¡un sandwitch de salchicha polaca inversa!
Posts relacionados