El significado del logotipo de varias letras en Visual C++
La nomenclatura húngara es un estándar de nomenclatura en programación. El principio básico es: nombre de variable = atributo + tipo + descripción del objeto, donde el nombre de cada objeto debe tener un significado claro, pudiendo ser el nombre completo o parte del nombre del objeto. La denominación debe ser fácil de recordar y comprender. Es importante garantizar la coherencia del nombre.
Por ejemplo, el nombre del formulario se puede abreviar como frm en la nomenclatura húngara. Cuando la variable del formulario se llama Switchboard, el nombre completo de la variable debe ser frmSwitchboard. De esta manera, es fácil ver por el nombre de la variable que el panel de conmutación es un formulario. Asimismo, si el tipo de variable es una etiqueta, debe llamarse lblSwitchboard. Se puede ver que la nomenclatura húngara es muy fácil de recordar y hace que los nombres de las variables sean muy claros y fáciles de entender, lo que mejora la legibilidad del código y facilita la comunicación entre programadores.
Se dice que el término fue inventado por un programador húngaro llamado Charles Simonyi. Posteriormente permaneció en Microsoft durante varios años y la nomenclatura se extendió por el mundo a través de diversos productos y documentos de Microsoft. Hoy en día, la mayoría de los programadores utilizan esta nomenclatura hasta cierto punto, independientemente del software que utilicen para el desarrollo. El punto de partida de este método de denominación es combinar nombres de variables en el orden de: atributo + tipo + descripción del objeto, de modo que los programadores tengan una comprensión intuitiva del tipo de variable y otros atributos al crear variables. La siguiente es la convención de nomenclatura de variables HN, algunas de las cuales son mis preferencias personales:
Sección de propiedades
Variables globales
g_
Constante
c_
Variables miembro de clase C++
m_
Variables estáticas
s_
Tipo de pieza
Aguja
p
Función
Función [Matemática]
No válida
v
Procesamiento
h
Entero largo
l
Booleano
b
Tipo de punto flotante (a veces llamado archivo)
f
Palabra doble
Abreviatura de ancho desarrollado)
Cadena
Tamaño (abreviatura de tamaño)
Entero corto
n
Doble coma flotante
d
Contando
c (normalmente cnt)
Carácter; letra
Ch (normalmente c)
Entero
I (normalmente n)
bytes
pasados
Palabra
w
Tipo real
r
Sin símbolo
u
Sección descripción
Máximo
Máximo
Mínimo
Hokkien
Inicialización
Inicialización
Variables temporales
Temperatura
Objeto de origen
Consejo de Investigación Científica
Objeto de destino
Plataforma de software para entornos de edificios y sistemas HVAC simulación
Aquí hay algunos ejemplos:
Hwnd: h es una descripción de tipo, que representa un identificador, y wnd es una variable La descripción del objeto representa una ventana, por lo que Hwnd representa un identificador de ventana
PFNeatapple: PFN es una descripción de tipo, lo que significa un puntero a una función, y eatapple es una descripción de objeto variable, por lo que significa.
Variable puntero de función que apunta a la función EatApple.
G _ Cch: G _ es una descripción de atributo, que representa una variable global. C y ch son tipo de recuento y tipo de carácter respectivamente, y juntos representan una clase de variable.
Escriba donde se ignora la descripción del objeto, por lo que representa una variable global que cuenta el número de caracteres.
Las anteriores son las reglas generales de la nomenclatura HN.
Resumen: nomenclatura húngara
Nomenclatura húngara
Convenciones de nomenclatura MFC, identificador, control y estructura variables de ejemplo de tipo de ventana Variables de ejemplo de clase MFC
HWND hWndCWnd * pWnd
HDLG hDlg; CDialog * pDlg
HDC hDCCDC * pDC
HGDIOBJ hGdiObjCGdiObject * pGdiObj
HPEN hPen; CPen * pPen
HBRUSH hBrushCBrush * pBrush
HFONT hFontCFont * pFont
HBITMAP hBitmapCBitmap * pBitmap
HPALETTE hPaltteCPalette * pPalette
HRGN hRgnCRgn * pRgn
HMENU hMenuCMenu * pMenu
HWND hCtlCState * pState
HWND hCtlCButton * pButton
HWND hCtlCEdit * pEdit
HWND hCtlCListBox * pListBox
HWND hCtlCComboBox * pComboBox
HWND hCtlCScrollBar * pScrollBar
HSZ hszStr< /p; >
Punto pt; CPoint esquina;
Tamaño; CSize tamaño;
RECT rectángulo; CRect rect
Ejemplo de tipo de prefijo de especificación de nomenclatura de prefijo universal p>
c clase o estructura CDocument, CPrintInfo
M_member variable m_pDoc, m_n client
Ejemplo de descripción de tipo de prefijo de especificación de nomenclatura de variable
Ch char 8- carácter de bit chGrade
Ch TCHAR Si se define _UNICODE, es el carácter de 16 bits chName.
Booleano
N int entero (su tamaño depende del sistema operativo) nLength
Cancelar valor sin signo (su tamaño depende del sistema operativo) nHeight p>
w palabra valor sin signo de 16 bits wPos
Entero largo con signo de 32 bits l desplazamiento
Entero sin signo de 32 bits
P *Puntero pDoc
Lp far *Puntero lejano lpszName
Puntero de cadena de 32 bits
Puntero de cadena constante de 32 bits
Si por definición _UNICODE , Lpsz LPCTSTR es un puntero de cadena constante de 32 bits lpszName.
Identificador de objeto de ventana
Lpfn CALLBACK es un puntero lejano que apunta a la función de devolución de llamada.
Rango de instancias de tipo de símbolo de prefijo
IDR_Múltiples recursos de diferentes tipos * * *Disfruta de ID IDR_mai en el marco1 ~ 0x6fff.
Recurso IDD_dialog IDD_spell_check1 ~ 0x6fff
Contexto de ayuda del recurso HIDD_Dialog hidd_spell_check 0x 20001 ~ 0x 26 ff
Recurso de mapa de bits BID_empresa_logo1 ~ 0x6fff
IDC_ recurso de cursor IDC_ pencil1 ~ 0x6fff
IDI_Icon recurso idi _Notepad 1 ~ 0x6fff
ID_Command ID del elemento de menú o barra de herramientas_Tools ID_Tools_SPELLING 0x 8000 ~ 0x dfff
Contexto de ayuda de HID_command HID_tools_spelling 0x 18000 ~ 0x 1 dfff
El cuadro de mensaje IDP_ indica IDP_IDP_INVALID_part no 8 ~ 0x deef.
HIDP_Cuadro de mensajes contexto de ayuda hidp_invalid_part no 0x 30008 ~ 0x 3 deff
IDS_ identificadores de recursos de cadena _ copyright 1 ~ 0x7eef
IDC_ El control en el cuadro de diálogo IDC_RECALC 8~0xDEEF
Tipo de nombre de convención de nomenclatura de macros de Microsoft MFC
Una versión única de la biblioteca de vínculos dinámicos (DLL) de AFXDLL.
_ALPHA sólo compila para procesadores DEC Alpha.
_DEBUG incluye una versión de depuración del diagnóstico.
_MBCS conjunto de caracteres multibyte compilados
_UNICODE Abra UNICODE en la aplicación.
Función proporcionada por AFXAPI MFC
Función de devolución de llamada mediante puntero.
Identificador de biblioteca Valores y significados del identificador con nombre
U ANSI(N) o Unicode(U)
d Depurar o liberar: D = Depurar ; ignorar el identificador publicado.
Descripción de la biblioteca de convención de nomenclatura de la versión de la biblioteca estática
Versión de depuración de NAFXCWD. LIB: biblioteca de enlaces estáticos MFC
NAFXCW. Distribución LIB: biblioteca de enlaces estáticos MFC
Versión de depuración de UAFXCWD. LIB: biblioteca de enlaces estáticos MFC que admite Unicode
UAFXCW. Versión LIB: biblioteca de enlaces estáticos MFC que admite Unicode.
Tipo de nombre de convención de nomenclatura de biblioteca de vínculos dinámicos
_AFXDLL La única versión de la biblioteca de vínculos dinámicos (DLL)
Función Winapi proporcionada por Windows
Nueva descripción de definición de tipo de convención de nomenclatura en Windows.h
WINAPI usa la posición FAR PASCAL en las declaraciones API. Si está escribiendo una DLL utilizando correcciones de API exportadas, puede usar este tipo en su propia API.
DEVOLUCIÓN DE LLAMADA Donde FAR PASCAL se utiliza en rutinas de devolución de llamada de aplicaciones como ventanas y cuadros de diálogo.
LPCSTR es lo mismo que LPSTR, excepto que LPCSTR se usa para punteros de cadena de solo lectura y su definición es similar (const char FAR*).
UINT es un tipo entero portátil sin signo cuyo tamaño está determinado por el entorno del host (32 bits para Windows NT y Windows 9x es sinónimo de int sin signo).
LRESULT El tipo de valor de retorno del ventanador.
lParam declara el tipo utilizado por LPARAM, que es el cuarto parámetro del programa de ventana.
wParam declara el tipo utilizado por WPARAM, que es el tercer parámetro del programa de ventana.
LPVOID es un tipo de puntero general, igual que (void *), y puede usarse en lugar de LPSTR.
-
Ataque a la nomenclatura húngara
La nomenclatura húngara es un estándar de nomenclatura en programación. Los estándares de denominación son los aspectos más importantes y controvertidos de los estándares de programación. Han sido un campo de batalla para los estrategas militares desde la antigüedad. ¿Para qué sirven las convenciones de nomenclatura? Cuatro palabras: Razonable y bien fundamentado. A través de la dicotomía, las convenciones de nomenclatura se pueden dividir en buenas y malas convenciones de nomenclatura, es decir, convenciones de nomenclatura bien fundadas y convenciones de nomenclatura bien fundadas. Los buenos zapatos hacen que el bailarín se sienta invisible, los malos zapatos hacen que el bailarín baile encadenado. Una mala convención de nomenclatura es más dañina que una buena convención de nomenclatura.
Lo que este artículo quiere demostrar es que la nomenclatura húngara es un mal estándar de denominación. El alcance de este artículo son los lenguajes de programación estáticamente fuertemente tipados. Las plantillas de análisis de este artículo son lenguaje C y lenguaje C ++. La ley húngara es la abreviatura de la nomenclatura húngara que aparece a continuación.
El costo de la nomenclatura húngara
La forma de la nomenclatura húngara es agregar el nombre del tipo delante del nombre de la variable, como nfoo, szfoo, pfoo y cpfoo representan respectivamente un número entero. variables y variables de cadena, variable de puntero, variable de puntero constante. Como puede verse, el método húngaro copia la información de tipo de la variable desde un solo lugar (donde se declara la variable) a varios lugares (donde se usa la variable), lo cual es un método redundante. Uno de los costos de un enfoque redundante es mantener la coherencia de las réplicas. Este precio se paga cuando es necesario cambiar el tipo de variable en el proceso de escritura y mantenimiento del código. El segundo costo de un enfoque redundante es el espacio adicional que ocupa. Un buen escritor respetará conscientemente una regla: la longitud mínima de la unidad organizativa del código debe ser inferior a 30 líneas naturales y, si supera las 50 líneas, debe reorganizarse. Escribir espacios para variables haría que esta regla fuera innecesariamente difícil.
2. Los beneficios de la nomenclatura húngara
Esto demuestra que los beneficios de la nomenclatura húngara son vagos e impredecibles.
Plantilla 1: strcpy (pstrfoo, pcstrfoo2) vs. strcpy (foo, foo2)
¿Cuáles son los beneficios de Hungría y Francia aquí? No puedo verlo. Ningún programador admitirá que no conoce los tipos de parámetros de la función strcpy.
Plantilla 2: Función desconocida (nfoo) y función desconocida (foo)
¿Cuáles son los beneficios de Hungría y Francia aquí? No puedo verlo. Para una función cuyo tipo se desconoce, el programador debe consultar la documentación de la función, lo que supone un coste. La única ventaja de utilizar el método húngaro es que cualquiera que mire el código sabe que la función requiere un parámetro entero. ¿De qué sirve? Una función es una interfaz y el tipo de parámetros es solo una pequeña parte de la interfaz. Funciones, información de salida, seguridad de subprocesos, seguridad de excepciones, legalidad de parámetros y otra información importante. Todavía necesito consultar.
Modelo 3: nfoo = nbar vs foo = bar
¿Cuáles son los beneficios de Hungría y Francia aquí? No puedo verlo. La única ventaja de utilizar el método húngaro es que la persona que lee el código sabe que aquí hay una copia de la variable entera, lo que suena bien y puede dormir tranquilo. Si ve nFoo=szBar, es posible que se despierte de su dulce sueño. Espera, ¿es eso realmente cierto? Creo que primero se debería activar el compilador. Por otro lado, nFoo=nBar sólo es legal sintácticamente. La gente que mira el código está realmente preocupada por la legalidad semántica, lo que no ayuda a Hungría y Francia. Por otro lado, un buen escritor seguirá conscientemente una regla: una o dos variables temporales son apropiadas en la unidad organizativa más pequeña del código, y si hay más de tres, debe reorganizarse. Combinado con la primera regla mencionada anteriormente, podemos concluir que el código que es fácil de entender debería serlo en sí mismo. Esta es la alta calidad incorporada en el código. Las buenas convenciones de nomenclatura son de ayuda limitada para la calidad de los edificios construidos, mientras que las malas convenciones de nomenclatura son más perjudiciales para la calidad de los edificios construidos de lo que la gente piensa.
En tercer lugar, la implementación de la nomenclatura húngara
Es necesario demostrar que la nomenclatura húngara es difícil de implementar en lenguaje C e imposible de implementar en lenguaje C++. Lógicamente hablando, es redundante defender la viabilidad de la ley húngara después de sacar conclusiones negativas sobre sus beneficios. Sin embargo, dado que Mark ha resucitado a enemigos baleados antes, también podría dar un paso más.
Como se mencionó anteriormente, la ley húngara es redundante para el sistema de tipos, por lo que la clave para implementar la ley húngara es si podemos replicar con precisión el sistema de tipos. Depende de la complejidad del sistema de tipos.
Echemos un vistazo al lenguaje C:
1. Tipos integrados: int, char, float, doble copia en n, ch, f, d. Parece que no hay ningún problema. ¿Pero quién puede decirme qué debe decir el vacío?
2. Tipo de combinación: matriz, unión, enumeración, estructura copiada como a, u, e, s? Parecía incómodo.
La dificultad aquí no es nombrar el tipo principal, sino nombrar los subtipos. ¿An representa una serie de números enteros? Sfoo, sbar representa estructura foo, ¿estructura barra? ¿Ausfoo representa una matriz de estructura sindical foo? ¿Estás cansado?
3. Tipo especial: puntero. En teoría, los punteros deberían ser tipos compuestos, pero pueden considerarse tipos integrados en el lenguaje C porque el lenguaje C no es muy estricto a la hora de distinguir diferentes tipos de punteros. Que comience el espectáculo: ¿pausfoo representa un puntero de matriz foo de estructura de unión? Ppp significa puntero. ¿puntero?
La pesadilla aún no ha terminado. Echemos un vistazo al lenguaje C ++ con un sistema de tipos más rico:
1.class: si la estructura en el lenguaje C se puede usar para lidiar con el pasado, entonces no sueñes con usar cls para lidiar con la clase en C++. Estrictamente hablando, las clases no son tipos en absoluto, sino herramientas para crear tipos. En C++, la cantidad de tipos integrados en el lenguaje es completamente insignificante en comparación con la cantidad de tipos definidos por el usuario creados por clases. ¿StdvectorFoo representa la variable de tipo vectorial de biblioteca estándar Foo? Idea loca.
2. Espacio de nombres: boostfilesystemiteratorFoo, que representa la variable de tipo de directorio transversal del subespacio del sistema de archivos Foo del espacio de impulso. Los programadores van a colapsar.
3. Plantilla: Recuerde STD::Map
4. Parámetros de la plantilla: plantilla
5. Modificación de tipo: estático, externo, mutable, registrado, volátil. , ¿pesadilla constante, corta, larga y sin firmar más modificación? Sigue siendo una pesadilla.
WM es mensaje de Windows, mensaje de Windows.