Estoy totalmente a favor de los prefijos bien hechos .
Creo que la notación húngara (Sistema) es responsable de la mayor parte del "mal rap" que obtienen los prefijos.
Esta notación es en gran medida inútil en lenguajes fuertemente tipados, por ejemplo, en C ++ "lpsz" para decirle que su cadena es un puntero largo a una cadena terminada en nulo, cuando: la arquitectura segmentada es historia antigua, las cadenas C ++ son, por convención común, punteros a terminación nula ¡matrices de caracteres, y no es realmente tan difícil saber que "customerName" es una cadena!
Sin embargo, sí uso prefijos para especificar el uso de una variable (esencialmente "Aplicaciones húngaras", aunque prefiero evitar el término húngaro debido a que tiene una asociación mala e injusta con el sistema húngaro), y esto es muy útil para ahorrar tiempo y enfoque de reducción de errores .
Yo suelo:
- m para miembros
- c para constantes / readonlys
- p para puntero (y pp para puntero a puntero)
- v para volátil
- s para estática
- i para índices e iteradores
- e para eventos
Cuando deseo aclarar el tipo , uso sufijos estándar (por ejemplo, Lista, ComboBox, etc.).
Esto hace que el programador sea consciente del uso de la variable cada vez que la ve / usa. Podría decirse que el caso más importante es "p" para el puntero (porque el uso cambia de var. A var-> y debe ser mucho más cuidadoso con los punteros: NULL, aritmética de punteros, etc.), pero todos los demás son muy útiles.
Por ejemplo, puede usar el mismo nombre de variable de múltiples maneras en una sola función: (aquí un ejemplo de C ++, pero se aplica igualmente a muchos lenguajes)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Puedes ver aquí:
- No hay confusión entre miembro y parámetro
- No hay confusión entre índice / iterador y elementos
- Uso de un conjunto de variables claramente relacionadas (lista de elementos, puntero e índice) que evitan las muchas dificultades de los nombres genéricos (vagos) como "cuenta", "índice".
- Los prefijos reducen la escritura (más corta y funcionan mejor con autocompletado) que alternativas como "itemIndex" y "itemPtr"
Otro gran punto de los iteradores de "iName" es que nunca indexo una matriz con el índice incorrecto, y si copio un ciclo dentro de otro ciclo no tengo que refactorizar una de las variables de índice del ciclo.
Compare este ejemplo irrealistamente simple:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(que es difícil de leer y a menudo conduce al uso de "i" donde se pretendía "j")
con:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(que es mucho más legible y elimina toda confusión sobre la indexación. Con el autocompletado en IDE modernos, esto también es rápido y fácil de escribir)
El siguiente beneficio es que los fragmentos de código no requieren ningún contexto para ser entendido. Puedo copiar dos líneas de código en un correo electrónico o un documento, y cualquiera que lea ese fragmento puede notar la diferencia entre todos los miembros, constantes, punteros, índices, etc. No tengo que agregar "oh, y tenga cuidado porque 'data' es un puntero a un puntero ", porque se llama 'ppData'.
Y por la misma razón, no tengo que mover mis ojos de una línea de código para entenderlo. No tengo que buscar a través del código para encontrar si 'datos' son locales, parámetros, miembros o constantes. No tengo que mover mi mano hacia el mouse para poder pasar el puntero sobre 'datos' y luego esperar a que aparezca una información sobre herramientas (que a veces nunca aparece). Por lo tanto, los programadores pueden leer y comprender el código significativamente más rápido, porque no pierden el tiempo buscando arriba y abajo o esperando.
(Si no crees que pierdes el tiempo buscando arriba y abajo para resolver las cosas, encuentra un código que escribiste hace un año y que no has visto desde entonces. Abre el archivo y salta a la mitad sin leerlo. Mira cómo ahora puedes leer desde este punto antes de que no sepas si algo es miembro, parámetro o local. Ahora salta a otra ubicación aleatoria ... Esto es lo que todos hacemos durante todo el día cuando estamos pasando el código de otra persona. o tratando de entender cómo llamar a su función)
El prefijo 'm' también evita la notación "this->" fea y prolija (IMHO) y la inconsistencia que garantiza (incluso si tiene cuidado, generalmente terminará con una mezcla de 'this-> data' y 'datos' en la misma clase, porque nada impone una ortografía coherente del nombre).
'esta' notación está destinada a resolver la ambigüedad , pero ¿por qué alguien escribiría deliberadamente código que puede ser ambiguo? La ambigüedad será conducir a un error, tarde o temprano. Y en algunos idiomas 'esto' no se puede usar para miembros estáticos, por lo que debe introducir 'casos especiales' en su estilo de codificación. Prefiero tener una sola regla de codificación simple que se aplique en todas partes: explícita, inequívoca y coherente.
El último beneficio importante es con Intellisense y autocompletado. Intente utilizar Intellisense en un formulario de Windows para encontrar un evento; debe desplazarse por cientos de métodos misteriosos de clase base a los que nunca necesitará llamar para encontrar los eventos. Pero si cada evento tuviera un prefijo "e", aparecerían automáticamente en un grupo bajo "e". Por lo tanto, el prefijo funciona para agrupar los miembros, concursos, eventos, etc. en la lista de intellisense, lo que hace que sea mucho más rápido y fácil encontrar los nombres que desea. (Por lo general, un método puede tener alrededor de 20-50 valores (locales, parámetros, miembros, concursos, eventos) que son accesibles en su alcance. Pero después de escribir el prefijo (quiero usar un índice ahora, entonces escribo 'i. .. '), se me presentan solo 2-5 opciones de autocompletar.
Soy un programador perezoso, y la convención anterior me ahorra mucho trabajo. Puedo codificar más rápido y cometo muchos menos errores porque sé cómo se deben usar todas las variables.
Argumentos en contra
Entonces, ¿cuáles son los contras? Los argumentos típicos contra los prefijos son:
"Los esquemas de prefijos son malos / malos" . Estoy de acuerdo en que "m_lpsz" y sus personajes están mal pensados y son completamente inútiles. Es por eso que aconsejaría usar una notación bien diseñada diseñada para cumplir con sus requisitos, en lugar de copiar algo que sea inapropiado para su contexto. (Use la herramienta adecuada para el trabajo).
"Si cambio el uso de algo, tengo que cambiarle el nombre" . Sí, por supuesto que sí, de eso se trata la refactorización, y por qué los IDE tienen herramientas de refactorización para hacer este trabajo de manera rápida y sin dolor. Incluso sin prefijos, cambiar el uso de una variable casi con certeza significa que su nombre debe cambiarse.
"Los prefijos solo me confunden" . Al igual que todas las herramientas hasta que aprenda a usarlas. Una vez que su cerebro se haya acostumbrado a los patrones de nomenclatura, filtrará la información automáticamente y realmente no le importará que los prefijos ya estén allí. Pero tiene que usar un esquema como este sólidamente durante una semana o dos antes de que realmente se vuelva "fluido". Y es entonces cuando muchas personas miran el código antiguo y comienzan a preguntarse cómo se las arreglaron sin un buen esquema de prefijos.
"Solo puedo mirar el código para resolver esto" . Sí, pero no necesita perder el tiempo buscando en otra parte del código o recordando cada pequeño detalle cuando la respuesta está justo en el punto en que su ojo ya está enfocado.
(Parte de) esa información se puede encontrar simplemente esperando que aparezca una información sobre herramientas en mi variable . Si. Cuando sea compatible, para algunos tipos de prefijos, cuando su código se compila limpiamente, después de una espera, puede leer una descripción y encontrar la información que el prefijo habría transmitido instantáneamente. Siento que el prefijo es un enfoque más simple, más confiable y más eficiente.
"Es más escribir" . De Verdad? ¿Un personaje entero más? O lo es: con las herramientas de autocompletado IDE, a menudo reducirá la escritura, porque cada carácter de prefijo reduce significativamente el espacio de búsqueda. Presione "e" y los tres eventos en su clase aparecerán en intellisense. Presione "c" y las cinco constantes se enumeran.
"Puedo usar en this->
lugar de m
" . Bueno, si puedes. ¡Pero ese es un prefijo mucho más feo y más detallado! Solo conlleva un riesgo mucho mayor (especialmente en equipos) porque para el compilador es opcional y, por lo tanto, su uso es con frecuencia inconsistente. m
por otro lado es breve, claro, explícito y no opcional, por lo que es mucho más difícil cometer errores al usarlo.