lunes, 13 de septiembre de 2010

Notación húngara

Me llevé una decepción hace tiempo, entré por curiosidad en una página explicativa, sobre el API de Windows, y me enteré de una genialidad llamada notación húngara. Es algo que ya hacía, mas o menos, sin saber su existencia, pero, una vez te lo lees y lo pones en práctica, tus programas se hacen mas intuitivos a los ojos de otros programadores, y tu mismo, los entiendes mucho mejor.


Básicamente, se trata de un sistema usado para crear nombres de variables. Por igual, lo podemos usar para instancias de objetos, funciones y procedimientos, etc. (Gracias Wikipedia, no encontraba las palabras para definirlo)

Consiste en dar un nombre descriptivo a nuestras variables, y acompañarlas de un sufijo que indica de qué tipo son. Sencillo como veis, pero esto es mas importante de lo que parece.

El otro día, viendo a un compañero programar, vi como ponía varias variables con los nombres a, b, c, d, etc. Al poco tiempo, se hizo un lío, pues no sabía para qué era cada variable, qué tipo de datos contenían, etc. Con la notación húngara, evitamos estos pequeños despistes.

Para evitar copiarme a mano la tabla entera, hago copy&paste desde Wikipedia.

a de 'array'. Para vectores/matrices/listas de n dimensiones ordenados escalarmente.
b de 'booleano'. Para variables que tomen sólo dos tipos de valores.
c de 'char'. Para el tipo primitivo de carácter alfanumérico individual.
d de 'double'. Para tipos numéricos de alta precisión, como double o float.
e de 'event'. Para eventos.
f de 'función'. Sólo la utilizaremos delante de funciones cuando se traten de funciones que se añadan como observadores de un evento (ya que usar esta notación para cualquier método o función sería bastante engorroso).
g de 'delegated'. Para tipos delegados.
h de 'hashtable'. Colecciones ordenables mediante clave hash (hUsuarios[“juan23”]).
i de 'int'. Para números enteros en general, tanto enteros normales como aquellos tipos enteros de más capacidad (como long).
l de 'lock'. Para objetos de control que nos faciliten el uso de exclusiones mutuas, candados y semáforos.
n de 'enum'. Para tipos enumerados.
o de 'objeto'. Para objetos en general (no se debe usar la notación húngara para distinguir entre tipos de objetos, salvo escasas excepciones).
p de 'puntero'. Para lenguajes con aritmética de punteros.
s de 'string'. Para variables de tipo cadena de texto, ya sean nativos o arrays de chars. Este tipo de datos es muy habitual en lenguajes sin lógica de punteros. Si se usara el objeto de tipo “String” en estos casos, acudiremos a este identificador en lugar de al ‘o’ de objeto.
t de 'struct'. Similar al 'o' de objetos, éste se usaría para variables de tipo struct en general (es decir, objetos de tipo primitivo).
v de 'variable'. Para variables que adquieran diferentes tipos de valores. Normalmente sólo acudiremos a esta opción en lenguajes no tipados (como JavaScript/EcmaScript). La usaremos cuando no estemos seguros del tipo de valor que albergará una variable. También puede valer para objetos que tengan un tipo genérico T.
y de 'byte'.
Veamos ahora un ejemplo sencillo para acabar de comprender el funcionamiento. Imaginemos que tenemos una variable, la cual se encarga de recoger el precio de un disco de una tienda de música. Debemos usar el tipo Float para almacenar números reales, y debemos darle a la variable un nombre descriptivo. Puede ser así:

float dPrecio;
Otra situación, queremos almacenar el nombre del disco anteriormente mencionado, podemos usar algo como:

char sNombreDisco[30];

7 comentarios:

  1. Gran aporte, creo que lo voy a usar a partir de ahora xDD

    ResponderEliminar
  2. La verdad que es muy intuitivo. Ya había oído hablar de tal notación.

    Un saludo.

    ResponderEliminar
  3. A mi me habian dicho en clase que lo usara pero llevandose todo el merito ellos... estafadores! xD

    ResponderEliminar
  4. Che, viene bien para lenguajes tipados con datos primitivos (c, pascal, etc.), pero para lenguajes orientados a Objetos fuertemente tipados, no tiene Mucho sentido, ya que el polimorfismo cambia el tipo de los objetos en tiempo de ejecucion y mas aún con los lenguajes que no tienen tipos, una variable puede contener "cualquier cosa" en ella.

    ResponderEliminar
  5. Ya, pero como el blog está orientado principalmente a novatos en programación, con lenguajes como C, pues viene bien.

    Realmente en lenguajes como Python, no uso notación húngara, me limito a nombrar a las variables por su función en el programa.

    ResponderEliminar
  6. Programo en el lenguage PL/SQL de Oracle (que esta basado en Algol y Pascal) y usamos extensivamente la notación húngara, entre otras cosas porque el proveedor que diseñó el sistema de información para facturar lo usa.
    --
    Dado que PL/SQL es un lenguaje con tipos de datos fuertemente definido, la notaciónn favorece la claridad de código.

    ResponderEliminar