La notación húngara es una convención de nomenclatura de identificadores en programación informática en la que el nombre de una variable o función indica su intención o tipo, o en algunos dialectos, su tipo . La notación húngara original utiliza sólo intención o tipo en su convención de nomenclatura y, a veces, se denomina Apps húngaras, ya que se hizo popular en la división Microsoft Apps en el desarrollo de aplicaciones de Microsoft Office . Cuando la división de Microsoft Windows adoptó la convención de nomenclatura, la basó en el tipo de datos real, y esta convención se difundió ampliamente a través de la API de Windows ; A esto a veces se le llama notación húngara de sistemas .
Simonyi : ...BCPL [tenía] un solo tipo que era una palabra de 16 bits... no es que importe.
Booch : A menos que continúes con la notación húngara.
Simonyi : Por supuesto... también pasamos a los idiomas mecanografiados más tarde... Pero... mirábamos un nombre y les contaba exactamente mucho sobre eso... [1]
La notación húngara fue diseñada para ser independiente del lenguaje y encontró su primer uso importante con el lenguaje de programación BCPL . Debido a que BCPL no tiene tipos de datos distintos de la palabra de máquina , nada en el lenguaje en sí ayuda al programador a recordar los tipos de variables. La notación húngara pretende remediar este problema proporcionando al programador un conocimiento explícito del tipo de datos de cada variable.
En notación húngara, el nombre de una variable comienza con un grupo de letras minúsculas que son mnemónicos para el tipo o propósito de esa variable, seguidas del nombre que haya elegido el programador; esta última parte a veces se distingue como el nombre de pila . El primer carácter del nombre de pila se puede escribir en mayúscula para separarlo de los indicadores de tipo (ver también CamelCase ). De lo contrario, el caso de este carácter denota alcance.
La notación húngara original fue inventada por Charles Simonyi , un programador que trabajó en Xerox PARC entre 1972 y 1981 y que más tarde se convirtió en arquitecto jefe de Microsoft . El nombre de la notación es una referencia a la nación de origen de Simonyi y también, según Andy Hertzfeld , porque hacía que los programas "parecieran escritos en algún idioma extranjero inescrutable". [2] Los nombres de los húngaros están "invertidos" en comparación con la mayoría de los demás nombres europeos; el apellido precede al nombre de pila . Por ejemplo, el nombre inglés "Charles Simonyi" en húngaro era originalmente "Simonyi Károly". De la misma manera, el nombre del tipo precede al "nombre de pila" en notación húngara. El estilo similar de denominación de "tipo último" de Smalltalk (por ejemplo, aPoint y lastPoint) era común en Xerox PARC durante el mandato de Simonyi allí. [ cita necesaria ]
El artículo de Simonyi sobre la notación se refería a los prefijos utilizados para indicar el "tipo" de información que se almacena. [3] [4] Su propuesta se refería en gran medida a decorar los nombres de los identificadores basándose en la información semántica de lo que almacenan (en otras palabras, el propósito de la variable ). La notación de Simonyi pasó a denominarse Aplicaciones húngaras, ya que la convención se utilizaba en la división de aplicaciones de Microsoft. Los sistemas húngaros se desarrollaron posteriormente en el equipo de desarrollo de Microsoft Windows . Apps Húngaro no es completamente distinto de lo que se conoció como Sistemas Húngaro, ya que algunos de los prefijos sugeridos por Simonyi contienen poca o ninguna información semántica (ver ejemplos a continuación). [4]
Donde difieren la notación de sistemas y la notación de aplicaciones es en el propósito de los prefijos.
En notación húngara de sistemas, el prefijo codifica el tipo de datos real de la variable. Por ejemplo:
lAccountNum
: la variable es un número entero largo ( "l"
);arru8NumberList
: la variable es una matriz de enteros de 8 bits sin signo ( "arru8"
);bReadLine(bPort,&arru8NumberList)
: función con un código de retorno de valor de byte.strName
: La variable representa una cadena ( "str"
) que contiene el nombre, pero no especifica cómo se implementa esa cadena.La notación húngara de las aplicaciones se esfuerza por codificar el tipo de datos lógico en lugar del tipo de datos físico; de esta manera, da una pista sobre cuál es el propósito de la variable o qué representa.
rwPosition
: la variable representa una fila ( "rw"
);usName
: la variable representa una cadena insegura ( "us"
), que debe "desinfectarse" antes de usarse (por ejemplo, consulte inyección de código y secuencias de comandos entre sitios para ver ejemplos de ataques que pueden ser causados por el uso de entradas sin procesar del usuario).szName
: la variable es una cadena terminada en cero ( ) "sz"
; este fue uno de los prefijos sugeridos originalmente por Simonyi.La mayoría de los prefijos sugeridos por Simonyi, aunque no todos, son de naturaleza semántica. A los ojos modernos, algunos prefijos parecen representar tipos de datos físicos, como sz
cadenas. Sin embargo, tales prefijos todavía eran semánticos, ya que Simonyi pretendía la notación húngara para idiomas cuyos sistemas de tipos no podían distinguir algunos tipos de datos que los idiomas modernos dan por sentado.
Los siguientes son ejemplos del artículo original: [3]
pX
es un puntero a otro tipo X ; esto contiene muy poca información semántica.d
es un prefijo que significa diferencia entre dos valores; por ejemplo, dY podría representar una distancia a lo largo del eje Y de un gráfico, mientras que una variable simplemente llamada y podría ser una posición absoluta. Esto es de naturaleza completamente semántica.sz
es una cadena terminada en nulo o cero. En C, esto contiene cierta información semántica porque no está claro si una variable de tipo char* es un puntero a un solo carácter, una matriz de caracteres o una cadena terminada en cero.w
Marca una variable que es una palabra. Básicamente, no contiene ninguna información semántica y probablemente se consideraría sistemas húngaros.b
marca un byte, que a diferencia de w podría tener información semántica, porque en C el único tipo de datos de tamaño de byte es char , por lo que a veces se usan para contener valores numéricos. Este prefijo podría aclarar la ambigüedad entre si la variable contiene un valor que debe tratarse como un carácter o un número.Si bien la notación siempre utiliza letras minúsculas iniciales como mnemónicos, no prescribe los mnemónicos en sí. Existen varias convenciones ampliamente utilizadas (ver ejemplos a continuación), pero se puede usar cualquier conjunto de letras, siempre que sean consistentes dentro de un cuerpo de código determinado.
Es posible que el código que utiliza la notación húngara de aplicaciones contenga a veces sistemas húngaros al describir variables que se definen únicamente en términos de su tipo.
En algunos lenguajes de programación, una notación similar ahora llamada sigilos está integrada en el lenguaje y el compilador la aplica. Por ejemplo, en algunas formas de BASIC , name$
nombra una cadena y count%
nombra un número entero . La principal diferencia entre la notación húngara y los sigilos es que los sigilos declaran el tipo de variable en el idioma, mientras que la notación húngara es puramente un esquema de nombres sin efecto en la interpretación automática del texto del programa.
bBusy
: booleanochInitial
: carbóncApples
: recuento de artículosdwLightYears
: palabra doble (Sistemas)fBusy
: bandera (o flotante )nSize
: número entero (Sistemas) o recuento (Aplicaciones)iSize
: entero (Sistemas) o índice (Aplicaciones)fpPrice
: punto flotantedecPrice
: decimaldbPi
: doble (Sistemas)pFoo
: punterorgStudents
: matriz o rangoszLastName
: cadena terminada en cerou16Identifier
: entero de 16 bits sin signo (Sistemas)u32Identifier
: entero de 32 bits sin signo (Sistemas)stTime
: estructura de tiempo del relojfnFunction
: nombre de la funciónLos mnemónicos para punteros y matrices , que no son tipos de datos reales, suelen ir seguidos del tipo del elemento de datos en sí:
pszOwner
: puntero a una cadena terminada en cerorgfpBalances
: matriz de valores de punto flotanteaulColors
: matriz de largos sin firmar (Sistemas)Si bien la notación húngara se puede aplicar a cualquier lenguaje y entorno de programación, Microsoft la adoptó ampliamente para su uso con el lenguaje C, en particular para Microsoft Windows , y su uso sigue estando limitado en gran medida a esa área. En particular, el uso de la notación húngara fue ampliamente evangelizado por "Programming Windows" de Charles Petzold , el libro original (y para muchos lectores, el definitivo) sobre programación API de Windows . Por lo tanto, muchas construcciones de notación húngara que se ven comúnmente son específicas de Windows:
wParam
(parámetro de tamaño de palabra) y lParam
(parámetro de entero largo) para la función WindowProc ().hwndFoo
: manejar a una ventanalpszBar
: puntero largo a una cadena terminada en ceroLa notación a veces se extiende en C++ para incluir el alcance de una variable, opcionalmente separada por un guión bajo. [5] [6] Esta extensión también se utiliza a menudo sin la especificación de tipo húngara:
g_nWheels
: miembro de un espacio de nombres global, número enterom_nWheels
: miembro de una estructura/clase, número enterom_wheels
, _wheels
: miembro de una estructura/clases_wheels
: miembro estático de una clasec_wheels
: miembro estático de una funciónEn el código JavaScript que usa jQuery$
, a menudo se usa un prefijo para indicar que una variable contiene un objeto jQuery (a diferencia de un objeto DOM simple o algún otro valor). [7]
(Algunos de estos se aplican únicamente a los sistemas húngaros).
Los partidarios argumentan que los beneficios de la notación húngara incluyen: [3]
btn
se pueden encontrar todos los objetos Botón.La mayoría de los argumentos en contra de la notación húngara están en contra de la notación húngara de Systems , no de la notación húngara de Apps . Algunos problemas potenciales son:
a_crszkvc30LastNameCol
: un argumento de referencia constante , que contiene el contenido de una columna de base de datos de tipo varchar (30) que es parte de la clave principal de la tabla . LastName
... hoy en día, HN y otras formas de codificación de tipos son simplemente impedimentos. Hacen que sea más difícil cambiar el nombre o tipo de una variable, función, miembro o clase. Hacen que sea más difícil leer el código. Y crean la posibilidad de que el sistema de codificación engañe al lector. [10]
Codificar el tipo de una función en el nombre (la llamada notación húngara) es un daño cerebral: el compilador conoce los tipos de todos modos y puede verificarlos, y solo confunde al programador. [11]
Aunque la convención de nomenclatura húngara ya no se utiliza ampliamente, la idea básica de estandarizar abreviaturas concisas y precisas sigue teniendo valor. Los prefijos estandarizados le permiten verificar los tipos con precisión cuando utiliza tipos de datos abstractos que su compilador no necesariamente puede verificar. [12]
No, no recomiendo el 'húngaro'. Considero 'húngaro' (incorporar una versión abreviada de un tipo en un nombre de variable) como una técnica que puede ser útil en lenguajes sin tipo, pero es completamente inadecuada para un lenguaje que soporta programación genérica y programación orientada a objetos, las cuales enfatizan selección de operaciones basadas en el tipo y argumentos (conocidos por el lenguaje o por el soporte de tiempo de ejecución). En este caso, "construir el tipo de un objeto en nombres" simplemente complica y minimiza la abstracción. [13]
Si lees atentamente el artículo de Simonyi, a lo que se refería era al mismo tipo de convención de nomenclatura que utilicé en mi ejemplo anterior, donde decidimos que
us
significaba una cadena insegura ys
una cadena segura. Ambos son de tipostring
. El compilador no le ayudará si asigna uno al otro e Intellisense [un sistema inteligente de finalización de código ] no le dirá bupkis. Pero son semánticamente diferentes. Deben interpretarse y tratarse de manera diferente y será necesario llamar a algún tipo de función de conversión si asigna uno al otro o tendrá un error de tiempo de ejecución. Si tienes suerte. Las aplicaciones húngaras todavía tienen un enorme valor, ya que aumentan la colocación en el código, lo que hace que el código sea más fácil de leer, escribir, depurar y mantener y, lo más importante, hace que el código incorrecto parezca incorrecto... (Sistemas húngaro) fue un malentendido sutil pero completo de la intención y la práctica de Simonyi. [4]