La notación húngara es una convención de nombres 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 usa solo intención o tipo en su convención de nombres y a veces se la llama húngaro de aplicaciones , ya que se hizo popular en la división Microsoft Apps en el desarrollo de aplicaciones de Microsoft Office . Cuando la división Microsoft Windows adoptó la convención de nombres, la basaron en el tipo de datos real, y esta convención se difundió ampliamente a través de la API de Windows ; esto a veces se llama notación húngara de sistemas .
Simonyi : ...BCPL [tenía] un solo tipo que era una palabra de 16 bits... pero eso no importa.
Booch : A menos que continúes con la notación húngara.
Simonyi : Por supuesto... luego pasamos a los lenguajes tipificados... pero... nos fijamos en un nombre y te contaré mucho sobre él... [1]
La notación húngara fue diseñada para ser independiente del lenguaje y encontró su primer uso importante en el lenguaje de programación BCPL . Debido a que BCPL no tiene otros tipos de datos que la palabra de máquina , nada en el lenguaje en sí ayuda a un programador a recordar los tipos de variables. La notación húngara tiene como objetivo remediar esto al proporcionar al programador un conocimiento explícito del tipo de datos de cada variable.
En la notación húngara, el nombre de una variable comienza con un grupo de letras minúsculas que son mnemotécnicas para el tipo o propósito de esa variable, seguido por el nombre que el programador haya elegido; 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 (consulte también CamelCase ). De lo contrario, el uso de mayúsculas y minúsculas de este carácter denota el 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 otros nombres europeos; el apellido precede al nombre de pila . Por ejemplo, el nombre anglicanizado "Charles Simonyi" en húngaro era originalmente "Simonyi Károly". De la misma manera, el nombre del tipo precede al "nombre de pila" en la notación húngara. El estilo de denominación similar de "último tipo" de Smalltalk (por ejemplo, aPoint y lastPoint) era común en Xerox PARC durante el mandato de Simonyi allí. [ cita requerida ]
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 almacenaba. [3] [4] Su propuesta se centraba principalmente en 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 llamarse húngaro de aplicaciones, ya que la convención se utilizó en la división de aplicaciones de Microsoft. El húngaro de sistemas se desarrolló más tarde en el equipo de desarrollo de Microsoft Windows . El húngaro de aplicaciones no es completamente distinto de lo que se conoció como húngaro de sistemas, ya que algunos de los prefijos sugeridos por Simonyi contienen poca o ninguna información semántica (consulte los ejemplos a continuación). [4]
Donde la notación de sistemas y la notación de aplicaciones difieren es en el propósito de los prefijos.
En la notación húngara de sistemas, el prefijo codifica el tipo de datos real de la variable. Por ejemplo:
lAccountNum
: variable es un entero largo ( "l"
);arru8NumberList
: 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 intenta codificar el tipo de datos lógicos en lugar del tipo de datos físicos; de esta manera, da una pista sobre cuál es el propósito de la variable o qué representa.
rwPosition
: variable representa una fila ( "rw"
);usName
: la variable representa una cadena insegura ( "us"
), que necesita ser "desinfectada" antes de ser utilizada (por ejemplo, consulte la inyección de código y los scripts entre sitios para ver ejemplos de ataques que pueden ser causados por el uso de la entrada del usuario sin procesar)szName
: variable es una cadena terminada en cero ( ) ; este fue uno de los prefijos sugeridos originalmente"sz"
por Simonyi.La mayoría de los prefijos que sugirió Simonyi, aunque no todos, son de naturaleza semántica. Para los ojos modernos, algunos prefijos parecen representar tipos de datos físicos, como sz
cadenas. Sin embargo, esos prefijos seguían siendo semánticos, ya que Simonyi pretendía que la notación húngara fuera para idiomas cuyos sistemas de tipos no podían distinguir algunos tipos de datos que los idiomas modernos dan por sentados.
Los siguientes son ejemplos del artículo original: [3]
pX
es un puntero a otro tipo X ; 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 llamada y podría ser una posición absoluta. Esto es de naturaleza completamente semántica.sz
es una cadena terminada en cero o nula. 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. Esta no contiene prácticamente ninguna información semántica y probablemente se consideraría húngaro de sistemas.b
marca un byte, que a diferencia de w puede tener información semántica, porque en C el único tipo de datos de tamaño byte es char , por lo que a veces se utilizan para contener valores numéricos. Este prefijo puede aclarar la ambigüedad sobre 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 mnemotecnia, no prescribe las mnemotecnias en sí. Existen varias convenciones ampliamente utilizadas (ver ejemplos a continuación), pero se puede utilizar cualquier conjunto de letras, siempre que sean coherentes dentro de un cuerpo de código determinado.
Es posible que el código que utiliza la notación húngara de aplicaciones a veces contenga húngaro de sistemas al describir variables que se definen únicamente en términos de su tipo.
En algunos lenguajes de programación, una notación similar llamada sigilos está incorporada al lenguaje y es aplicada por el compilador. Por ejemplo, en algunas formas de BASIC , name$
nombra una cadena y count%
nombra un entero . La principal diferencia entre la notación húngara y los sigilos es que los sigilos declaran el tipo de la variable en el lenguaje, mientras que la notación húngara es puramente un esquema de nombres sin efecto en la interpretación de la máquina del texto del programa.
bBusy
: booleanochInitial
: caráctercApples
:conteo de artículosdwLightYears
: palabra doble (sistemas)fBusy
: bandera (o flotador )nSize
: entero (sistemas) o conteo (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 del 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 cadena terminada en cerorgfpBalances
: matriz de valores de punto flotanteaulColors
: matriz de valores largos sin signo (sistemas)Aunque 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 difundido por Charles Petzold en "Programming Windows" , el libro original (y para muchos lectores, el definitivo) sobre programación de 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
el (parámetro de entero largo) para la función WindowProc ().hwndFoo
: manejar 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 usa a menudo sin la especificación de tipo húngara:
g_nWheels
: miembro de un espacio de nombres global, enterom_nWheels
: miembro de una estructura/clase, 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 utiliza jQuery , $
a menudo se utiliza un prefijo para indicar que una variable contiene un objeto jQuery (en lugar de un objeto DOM simple o algún otro valor). [7]
(Algunas de estas opciones 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 Button.La mayoría de los argumentos en contra de la notación húngara se refieren a la notación húngara de sistemas , no a la notación húngara de aplicaciones [ cita requerida ] . 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 el 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 confunda al lector. [10]
Codificar el tipo de una función en el nombre (la llamada notación húngara) es perjudicial para la salud: el compilador conoce los tipos de todos modos y puede comprobarlos, y eso sólo confunde al programador. [11]
Aunque la convención de nomenclatura húngara ya no se usa ampliamente, la idea básica de estandarizar abreviaturas precisas y concisas sigue teniendo valor. Los prefijos estandarizados permiten verificar los tipos con precisión cuando se utilizan tipos de datos abstractos que el compilador no necesariamente puede verificar. [12]
No, no recomiendo el "húngaro". Considero que el "húngaro" (incorporar una versión abreviada de un tipo en el nombre de una variable) es una técnica que puede ser útil en lenguajes sin tipos, pero que es completamente inadecuada para un lenguaje que admita programación genérica y programación orientada a objetos, que enfatizan la selección de operaciones en función del tipo y los argumentos (conocidos por el lenguaje o por el soporte en tiempo de ejecución). En este caso, "compilar el tipo de un objeto en nombres" simplemente complica y minimiza la abstracción. [13]
Si lees el artículo de Simonyi con atención, lo que quería decir era el mismo tipo de convención de nombres que usé en mi ejemplo anterior, donde decidimos que
us
significaba cadena insegura ys
que significaba cadena segura. Ambos son de tipostring
. El compilador no te ayudará si asignas uno al otro e Intellisense [un sistema de finalización de código inteligente ] no te dirá nada. 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 asignas uno al otro o tendrás un error de tiempo de ejecución. Si tienes suerte. El húngaro de aplicaciones sigue teniendo un enorme valor, ya que aumenta 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 erróneo parezca erróneo... (Húngaro de sistemas) fue un malentendido sutil pero completo de la intención y la práctica de Simonyi. [4]