Luchando por no usar la notación húngara

10

He visto argumentos a favor y en contra de Systems Hungarian . Durante algunos años he estado trabajando en un proyecto heredado que utiliza este sistema al nombrar cada variable, función con un prefijo del tipo de variable, por ejemplo (strName, intAge, btnSubmit, etc.) (conozco los prefijos originales de las aplicaciones húngaras por el tipo de variable, no el tipo). Me gustaría que mi próximo proyecto lo abandone por completo, pero me resulta más difícil nombrar cosas similares de forma única sin recurrir a él.

Digamos que tengo un formulario web para recopilar direcciones de correo electrónico y almacenarlas en una tabla de base de datos, y un botón que llama a la función que guarda la dirección en la base de datos.

Si estoy usando la notación de estilo húngaro, podría llamar al cuadro txtEmailel botón btnEmaily el valor contenido en el cuadro de texto strEmail. Entonces podría usar una función storeEmail(strEmail)para almacenar el correo electrónico. Tengo una convención clara aquí, es obvio cuál es cada variable.

¿Cuál sería la mejor práctica para nombrar estas variables?

  • sin recurrir a los sistemas húngaros,
  • sin hacerlos demasiado largos o confusos
  • y con una convención clara para usar en todo mi proyecto?
miedo
fuente
2
Quizás haya algo mal con el resto de sus convenciones de nombres, o el tamaño de sus funciones, si tiene problemas para encontrar nombres únicos.
¿Qué tecnología estás usando? Estos prefijos parecen prestarse a los formularios web.
StuperUser
Estoy usando ASP.NET (con C # detrás)
fearoffours
@delnan - ¿puedes dar más detalles por favor? ¿Por qué el tamaño de la función hace que la denominación sea más fácil?
fearoffours
@fearofours: una función más pequeña necesita menos variables, y menos variables obviamente significan menos enfrentamientos variables. Eso supone, por supuesto, que coloca todas las variables en el alcance más pequeño posible.

Respuestas:

8

Su último punto es el más importante: haga lo que haga, debe ser coherente en su proyecto y con sus colegas. Hay dos formas principales de lograr la consistencia y, si es posible, debe usar ambas. En primer lugar, use una herramienta para verificar las convenciones de nomenclatura en tiempo de compilación. En el mundo .Net, StyleCop sería un buen ejemplo de dicha herramienta. La segunda forma de obtener coherencia es tener revisiones por pares de todo el código, para que todos puedan estar atentos.

Sus otros dos puntos parecen estar preguntando acerca de una alternativa. No estoy seguro de que necesites una alternativa; El punto sobre que el húngaro ya no es popular es que solía ser utilizado para describir el tipo cuando el sistema de tipos y las herramientas eran un poco, digamos, menos estrictos. Es decir, si estaba programando en C y pasando punteros, la única forma de realizar un seguimiento del tipo era utilizando el húngaro. Ahora, si está utilizando un lenguaje como C # o Java, no utilizará punteros (o muy raramente), por lo que la necesidad de cualquier tipo de húngaro desaparece. Además, los IDE modernos le permiten ver el tipo muy fácilmente al pasar el mouse sobre la variable o, en el peor de los casos, usar un atajo para ver la declaración original. Entonces, no creo que necesites ningún tipo de notación, solo nombra la variable por lo que hace. Si es una dirección de correo electrónico, simplemente use "correo electrónico" o "

Steve
fuente
2
Se pone un poco más difícil cuando el formulario / página / ventana / lo que sea tiene un botón para el correo electrónico, un cuadro de texto para el correo electrónico, y tal vez otro control / Control de correo electrónico ...
FrustratedWithFormsDesigner
77
@FrustratedWithFormsDesigner No necesariamente. El cuadro de texto podría ser emailAddressInput, mientras que el botón será emailAddressSubmit y la representación interna será simplemente emailAddress.
Jonathan
@ Jonathan: Buen punto.
FrustratedWithFormsDesigner
3

Cuando se trata de formularios web / formularios de Windows / otras cosas gráficas, tiene sentido usar Systems Hungarian, ya que puede tener controles que están estrechamente unidos, por ejemplo, un cuadro de texto y una etiqueta que van juntos; podrías nombrarlos txtEmaily lblEmaildistinguirlos. En mi experiencia, esto es común y es realmente útil.

Pero en su código subyacente, este tipo de nombres es innecesario. Si tiene una variable de tipo stringque se está utilizando para almacenar un correo electrónico, simplemente asígnele un nombre email. Si, por alguna razón, se confunde, la mayoría de los IDE deberían permitirle pasar el mouse sobre él y ver su tipo. (Idealmente, en cosas OO, podría ser un atributo de algún objeto, y user.Emailes aún más claro).

Creo que si tiene más de un objeto declarado en su código que no es un control GUI que podría nombrarse correctamente email, algo está inherentemente mal con su diseño.

Andrew Arnold
fuente
1
En realidad, txt y lbl no son húngaros, txt es solo breve para Text y lbl es corto para Label, no hay razón para no usar la palabra completa, por ejemplo, EmailText y EmailLabel en un formulario. Húngaro sería el tipo, que en ambos casos es una cadena.
Steve
1
@ Steve Haigh - No, estoy hablando de los controles en sí. Tiene un objeto de tipo "cuadro de texto" llamado txtEmail, y un objeto de tipo "etiqueta" llamado lblEmail. Ninguno de ellos son cuerdas. Pueden tener propiedades de cadena, pero no son cadenas en sí mismas.
Andrew Arnold
1
Oh, lo siento. Sí, por supuesto. Aun así, no hay razón para no usar un nombre más descriptivo como EmailTextBox. El hecho de que VS genere un nombre pobre no significa que deba conservarlo. Sin embargo, en el contexto de las formas, las abreviaturas txt y lbl se entienden tan bien que probablemente no me preocuparía en ese caso.
Steve
3

¿Qué hace que una variable sea "demasiado larga"?

En lugar de txtEmail, btnEmailusted podría utilizar UserEmailText, UserEmailButtony AdminEmailText,AdminEmailButton

El problema con esto es que puede comenzar a sentir que la variable comienza a alargarse:

AdminEmailIsValid comienza a limitar el tiempo que permitiría que la variable sea.

Además, puede comenzar a notar que está reutilizando un conjunto de variables y un conjunto de operaciones en esas variables. Para esto está diseñado OOP . En lugar de un conjunto de variables, cree un objeto genérico:

class EmailForm
  var textBox, button, text
  function storeEmail()

Luego puede crear una instancia de una nueva variable como clase y usar la misma notación de puntos para acceder a sus datos:

userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )

Por supuesto, esto está dirigido a lenguajes que usan el paradigma OOP, pero la mayoría de los lenguajes populares de desarrollo web están orientados a objetos o permiten código orientado a objetos (PHP, Python, C #, C ++, Java, JavaScript, ActionScript, etc. )

zzzzBov
fuente
No veo la ventaja de UserEmailText para txtEmail: solo está sufriendo el tipo en lugar de prefijarlo. Sin embargo, me gusta "Esto es para lo que está diseñada OOP".
fearoffours
@fearoffours, OP admitió tener un problema con nombres únicos, agregué ese ejemplo como una forma descriptiva de distinguir entre dos variables similares ( UserEmailTexty AdminEmailTextespecíficamente). Por lo general, sufijo los tipos, ya que se presta para pasar a una clase UserEmailText-> UserEmail.text-> User.email.textdependiendo de la cantidad de abstracción / funcionalidad que sea necesaria.
zzzzBov
OK, mira de dónde vienes desde allí. +1 para la comparación de sufijo / clase. ¡Ah, y yo soy el OP!
fearoffours
@fearoffours, lol whoops ...
zzzzBov 05 de