2009-04-20 42 views
27

Antes de usar C#, C++ era mi lenguaje de programación principal. Y la notación húngara está en lo profundo de mi corazón.Notación húngara en C#

Hice algunos pequeños proyectos en C# sin leer un libro de C# u otras pautas sobre el idioma. En esos pequeños proyectos de C# utilicé algo así como

private string m_strExePath; 

Hasta que leí algo de manera que dicho:

No utilice la notación húngara.

¿Por qué? ¿Soy la única persona que tiene m_strExePath o m_iNumber en mi código C#?

+0

¿Duplicado? http: // stackoverflow.com/questions/659552/why-should-or-shouldnt-i-prefix-fields-with-m-in-c –

Respuesta

21

No, usted no es el único que lo hace. En general, se acepta que la notación húngara no es la mejor manera de nombrar cosas en C# (el IDE maneja muchos de los problemas que la notación húngara intentó abordar).

+1

¿Cómo maneja el IDE cualquier problema que aborde la notación húngara verdadera? No estoy hablando de los tipos de .Net aquí, vea el artículo de Joel en la respuesta principal. –

1

Si la notación húngara es profunda en su corazón y el de su equipo y el de su empresa, utilícelo. Ya no se considera una mejor práctica en cuanto a lo que puedo leer en blogs y libros.

1

Si mantiene el puntero sobre la variable en VS, le dirá qué tipo de variable es, por lo que no hay razón para ir con estos nombres de variables crípticos, especialmente porque las personas que provienen de otros idiomas pueden necesitar mantener el código y será un obstáculo para la lectura fácil.

29

No eres la única persona, pero diría que es relativamente poco común. Personalmente, no soy partidario de la notación húngara, al menos no en el sentido simple que simplemente repite la información de tipo que ya está presente en la declaración. (Los fanáticos de la notación húngara "verdadera" explicarán la diferencia, nunca me molestó tanto, pero puedo ver su punto. Si usa un prefijo común para, por ejemplo, unidades de longitud frente a unidades de peso, no lo hará accidentalmente asigne una variable de longitud con un valor de peso, aunque ambos pueden ser enteros).

Sin embargo, para miembros privados, puede hacer lo que quiera; acuerde con su equipo cuál debería ser la convención de nomenclatura. El punto importante es que si desea que su API encaje con el resto de .NET, no use la notación húngara en sus miembros públicos (incluidos los parámetros).

+0

@Jon: dicen que usar hugarian no es una buena práctica sino un problema real? ¿causa algún daño específicamente (problema de efeciencia/compilación)? persoanlly no lo uso en mi clase, pero para los elementos visuales como textBox, etiquetas, etc. uso txt y lbl, respectivamente. Comenta. –

+1

No, los nombres de las variables no cambian la eficiencia ni los tiempos de compilación, etc. Afectarán la legibilidad más que cualquier otra cosa. (Ah, y la variación de miembros públicos limitará la posibilidad de usar el tipo de idiomas que no distinguen entre mayúsculas y minúsculas, como VB). –

28

Al hacer el diseño de la interfaz de usuario, me pareció muy útil mantener la notación húngara. Los artículos como cuadros de texto, etiquetas y listas desplegables son mucho más fáciles de entender rápidamente y con frecuencia se consiguen repetir nombres de los controles:

lblTitle = Label 
txtTitle = TextBox 
ddlTitle = DropDownList 

Para mí eso es más fácil de leer y analizar. De lo contrario, la notación húngara no encaja debido a los avances en IDE, específicamente Visual Studio.

Además, Joel on Software tiene un excelente artículo relacionado con la notación húngara titulado: Making Wrong Code Look Wrong que hace algunos buenos argumentos para notación húngara.

+12

No estoy de acuerdo. Creo que es aún peor en este caso, especialmente cuando ingresas a los controles con nombres más largos o los abreviaturas de abreviatura de 3 letras con la abreviatura de 3 letras de otro control. En su lugar, utilizamos TitleLabel o TitleTextBox o TitleDropDown, etc. – John

+2

@John: Estoy totalmente de acuerdo. No hay límite de caracteres para nosotros y debemos hacer que las variables sean agradables y legibles. –

+3

@Jeff & John: el hecho de que no tengamos límite de caracteres no significa que se deba usar. Variables sucintas más pequeñas> Variables expresivas más largas –

5

menos que esté utilizando un editor de texto en lugar de la IDE de VS hay poco valor a la notación húngara y impeeds en vez de mejorar la legibilidad

6

Una desventaja de la notación húngara es que los desarrolladores suelen cambiar el tipo de variables durante la primera codificación, que requiere que el nombre de la variable también cambie.

+3

De acuerdo, agrega una carga de mantenimiento a una base de código. –

2

Los únicos dos áreas en las que actualmente veo cualquier forma de notación húngara son: variables miembro

  • Class, con un subrayado inicial (por ejemplo _someVar)
  • WinForms y nombres de control WebForms (btn para botón, lbl de etiqueta etc)

el subrayado inicial de variables miembro parece que está aquí para quedarse con nosotros por un tiempo más largo, pero espero ver la popularidad de Hun Garian en los nombres de control a disminuir.

+0

Evito * cualquier * guión bajo para evitar entrar en conflicto con los requisitos de nomenclatura de C++. Sí, sé que esto es C# ... –

47

Joel Spolsky tiene un muy buen article sobre este tema. El resumen rápido es que hay dos tipos de notación húngara que se usan en la práctica.

El primero es "Systems Hungarian" donde especifica el tipo de variable usando un prefijo. Cosas como "str" ​​para cuerda. Esta es una información casi inútil, especialmente porque los IDEs modernos te dirán el tipo de todos modos.

El segundo es "Aplicaciones húngaras" donde especifica el propósito de la variable con un prefijo. El ejemplo más común de esto es usar "m_" para indicar las variables miembro. Esto puede ser extremadamente útil cuando se hace correctamente.

Mi recomendación sería evitar "sistemas húngaros" como la peste pero definitivamente usar "aplicaciones húngaras" donde tenga sentido. Sugiero leer el artículo de Joel. Es un poco largo sin aliento, pero lo explica mucho mejor que pude.

La parte más interesante de este artículo es que el inventor original de la notación húngara, Charles Simonyi, creó "Aplicaciones húngaras", pero su trabajo fue horriblemente malinterpretado y la abominación de "Sistemas húngaros" se creó como resultado.

+0

Hemos tenido esta discusión antes, y puedo ver totalmente el punto de "Aplicaciones húngaras", pero me gustaría señalar que en C++ esto tampoco era necesario, si utilice la técnica descrita en el libro de Scott Meyers "Effective C++", artículo 18, página 78. –

+3

Tengo la 2da edición y el artículo 18 es "Esforzarme por interfaces de clase que sean completas y mínimas", lo cual no está relacionado con esto . –

+5

No veo el punto en Aplicaciones húngaro cuando el IDE puede decirle si algo es una variable miembro. –

10

No son sin duda la única persona, pero espero que eres parte de una tendencia a la baja :)

El problema con la notación húngara es que está tratando de implementar un sistema de tipo a través de las convenciones de nombres. Esto es extremadamente problemático porque es un sistema de tipo con solo verificación humana. Cada ser humano en el proyecto debe aceptar el mismo conjunto de estándares, hacer revisiones rigurosas de los códigos y asegurarse de que a todos los tipos nuevos se les asigna el prefijo correcto y apropiado. En resumen, es imposible garantizar la coherencia con una base de código lo suficientemente grande. En el momento en que no hay consistencia, ¿por qué lo haces?

Además, las herramientas no son compatibles con la notación húngara. Eso podría parecer un comentario estúpido en la superficie, pero considere refactorizar, por ejemplo. Cada refactorización en un sistema de convención de nomenclatura húngaro debe ir acompañada de un cambio de nombre masivo para garantizar el mantenimiento de los prefijos. Los cambios de nombre masivos son susceptibles a todo tipo de errores sutiles.

En lugar de utilizar nombres para implementar un sistema de tipos, solo confíe en el sistema de tipos. Tiene verificación automática y soporte de herramientas. Los nuevos IDE hacen que sea mucho más fácil descubrir el tipo de variable (intellisense, hover tips, etc ...) y realmente eliminan el deseo original de notación húngara.

13

la notación húngara es un terrible error, en cualquier idioma. No deberías usarlo en C++ tampoco. Nombra tus variables para que sepas para qué sirven. No los nombre para duplicar la información de tipo que el IDE puede proporcionarle de todos modos, y que puede cambiar (y por lo general es irrelevante de todos modos).Si sabe que algo es un contador, entonces no importa si es un int16, 32 o 64. Usted sabe que actúa como un contador, y como tal, cualquier operación que sea válida en un contador debe ser válida. Mismo argumento para las coordenadas X/Y. Son coordenadas. No importa si son flotadores o dobles. Puede ser relevante saber si un valor está en unidades de peso, distancia o velocidad. No importa que sea un flotador).

De hecho, la notación húngara solo apareció como un malentendido. El inventor tenía la intención de que se utilizara para describir el tipo "conceptual" de una variable (¿es una coordenada, un índice, un contador, una ventana?)

Y las personas que leyeron su descripción supusieron que por " escriba "quiso decir el tipo de lenguaje de programación real (int, float, cadena terminada en cero, puntero de char)

Nunca fue la intención, y es una idea horrible. Duplica la información que el IDE puede proporcionar mejor, y que no es tan relevante en primer lugar, ya que lo alienta a programar en el nivel de abstracción más bajo posible.

¿Por qué? ¿Soy la única persona que tiene m_strExePath o m_iNumber en mi código C# ?

No. Lamentablemente no. Dime, ¿qué sería exePath si no fuera una cadena? ¿Por qué, como lector de tu código, necesito saber que es una cadena? ¿No es suficiente saber que es el camino al ejecutable? m_iNumber es simplemente mal nombrado. que número es esto? ¿Para qué sirve? Me acabas de decir dos veces que es un número, pero todavía no sé cuál es el significado del número.

+2

El IDE puede proporcionar el tipo, pero solo si pierdo un segundo de mi tiempo sobre el nombre de la variable :-) Prefiero ser capaz de verlo de un vistazo ... Y para proporcionar un contrapunto a su ejemplo: exePath bien podría ser un objeto System.IO.FileInfo, un contenedor para una ruta de archivo que proporciona un fácil acceso a las operaciones comunes del sistema de archivos. Honestamente, no veo el daño en el prefijo de nombres de variables. Considero que facilita la inspección y depuración del código. –

+2

¿Para qué necesitas el tipo? Cuando programo, quiero saber qué representa una variable *, no qué tipo es. Si su 'exePath' es del tipo' FileInfo', está mal nombrado, y ** ese ** es su problema. El nombre de la variable dice que es una ruta, no un archivo real. Entonces, cuando lo uso, espero que se comporte como un nombre de ruta y no como un archivo. – jalf

0

En un lenguaje como C# donde no existen muchas limitaciones en la longitud del nombre variable que alguna vez estuvieron en lenguajes como C y C++, y donde el IDE proporciona soporte excelente para determinar el tipo de variable, la notación húngara es redundante .

El código debe explicarse por sí mismo para que nombres como m_szName puedan ser reemplazados por this.name. Y m_lblName puede ser nameLabel, etc. Lo importante es ser coherente y crear código que sea fácil de leer y mantener: este es el objetivo de cualquier convención de nomenclatura, por lo que siempre debe decidir qué convención usar en base a esto. Siento que la notación húngara no es la más legible o la más fácil de mantener porque puede ser demasiado escueta, requiere una cierta cantidad de conocimiento sobre lo que significan los prefijos, y no es parte del lenguaje y, por lo tanto, difícil de aplicar y difícil de detectar cuando el nombre ya no coincide con el tipo subyacente.

En su lugar, me gusta reemplazar aplicaciones húngaras (prefijos como m_) haciendo referencia a this para los miembros, haciendo referencia al nombre de clase para variables estáticas, y sin prefijo para variables locales. Y en lugar de System Hungarian (incluido el tipo de una variable en el nombre de la variable), prefiero describir para qué es la variable, como nameLabel, nameTextBox, count y databaseReference.

1

La mayoría de la notación húngara describe qué es la variable (un puntero, o un puntero a un puntero, o el contenido de un puntero, etc.), y a qué apunta (cadena, etc.).

He encontrado muy poco uso para los punteros en C#, especialmente cuando no hay llamadas no administradas/pinvoke. Además, no hay opción de usar void *, por lo que no es necesario que húngaro lo describa.

El único sobrante de húngaro que yo (y la mayoría de los demás en C# land) usa, es para los campos privados anteriores con _, como en _customers;

+1

De esta forma, sabrá instantáneamente si una variable es una variable local o de instancia y es útil en combinación con Intellisense porque todos los campos privados se muestran juntos en la parte superior y puede encontrar cualquier campo de instancia simplemente escribiendo _ – sam

5

El valor real en la notación húngara se remonta a la programación C y la naturaleza débilmente tipada de los punteros. Básicamente, en el día, la forma más fácil de hacer un seguimiento del tipo era utilizar el húngaro.

En idiomas como C#, el sistema de tipos te dice todo lo que necesitas saber, y el IDE te lo presenta de una manera muy fácil de usar por lo que simplemente no es necesario utilizar el húngaro.

Como una buena razón para no usarlo, bueno, hay bastantes. En primer lugar, en C# y para ese asunto C++ y muchos otros langause a menudo creas tus propios tipos, entonces ¿cuál sería el húngaro para un tipo "MyAccountObject"? Incluso si puede decidir sobre las notaciones húngaras sensibles, aún hace que el nombre de la variable real sea un poco más difícil de leer porque debe saltear el "LPZCSTR" (o lo que sea) al principio. Sin embargo, es más importante el costo de mantenimiento, ¿qué pasa si comienzas con una Lista y cambias a otro tipo de colección (algo que parece hacer mucho en este momento)? Luego necesita cambiar el nombre de todas sus variables que usan ese tipo, todo sin ningún beneficio real. Si hubiera usado un nombre decente para comenzar, no tendría que preocuparse por esto.

En su ejemplo, lo que si se crea o usa algún tipo más significativo para la celebración de una ruta (Ruta por ejemplo), entonces tienes que cambiar su m_strExePath-m_pathExePath, que es un dolor y en este caso no es realmente muy útil.

0

En algún momento, es muy probable que tenga una propiedad

public string ExecutablePath { ... } 

(no es que usted debe tratar de evitar las abreviaturas como "exe" también). Siendo ese el caso, su pregunta podría ser entonces discutible la mayor parte del tiempo que se puede utilizar C# de 3.0 auto-propiedades

public string ExecutablePath { get; set; } 

que ahora ya no tiene que llegar a un nombre para la variable almacén de respaldo. Sin nombre, sin pregunta/debate sobre convenciones de nombres.

Obviamente, las propiedades implementadas automáticamente no siempre son apropiadas.

+0

. Esta respuesta no tiene relación con Notación húngara.Pertenece a una pregunta que pregunta "¿Debería nombrar mi miembro privado _executablePath o m_executablePath o executablePath?", No esta. – Lucas

+0

alerta typo-means-the-opposite: "NOTE que debe intentar ...", – Lucas

+0

Usar propiedades automáticas -> no (o al menos menos) necesita siquiera pensar en tales convenciones de nomenclatura. –

0

Depende.

¿Es lo suficientemente significativo para agregar la descripción del tipo de datos en la variable/nombre del objeto en su método/clase?

sistema de notación húngara> Aplicaciones notación húngara

Si está diseñando en el lenguaje de procedimientos (por ejemplo, C) que tiene muchas de las variables globales o/y de menor API que se ocupa de los tipos de datos precisos y tamaños (por ejemplo, C's <stdint.h> donde se usan más de 40 anotaciones de tipos de datos diferentes para describir int), la notación húngara del sistema es más útil.

Nótese, sin embargo, muchos programadores modernos considerar la adición de información de tipo en nombre de la variable es abundante ya que muchos de los IDE modernos tienen herramientas muy convenientes (por ejemplo Outline de Eclipse, Symbol Navigator de Xcode, Visual AssistX de Visual Studio, etc.). La notación húngara del sistema fue ampliamente utilizada en las edades más tempranas en la programación (por ejemplo, FORTRAN, C99) cuando la información del tipo no estaba disponible fácilmente como una herramienta de los IDEs.

sistema de notación húngara < Aplicaciones notación húngara

Si está trabajando en la clase de nivel superior o método (por ejemplo, la clase/método de controlador definido por el usuario para su aplicación en C#), notating tipo de datos simple puede no ser lo suficiente como para describir la variable/objeto. Por lo tanto, utilizamos la notación húngara de aplicaciones en este caso.

Por ejemplo, si el propósito de su método es recuperar la ruta ejecutable y mostrar un mensaje de error si no se encuentra, en lugar de observar que es un tipo de string, notamos información más significativa para describir la variable/objeto para que los programadores comprendan mejor el propósito de la variable/obejct:

private string mPathExe; 
private string msgNotFound; 
0

Se trata de eficiencia. Cuánto tiempo se desperdició asignando el valor incorrecto a una variable. Tener declaraciones de variables precisas se trata de ganar en eficiencia. Se trata de la legibilidad. Se trata de seguir los patrones existentes. Si desea creatividad, haga diseño de interfaz de usuario, haga arquitectura de sistema. Si su programación, debe estar diseñada para que los miembros del equipo trabajen más fácilmente: no la suya. Una ganancia del 2% en eficiencias es una semana adicional cada año. Eso es 40 horas ganadas. Los aumentos de la productividad humana se logran combinando eficiencias.

0

La notación húngara encontró su primer uso principal con el lenguaje de programación BCPL. BCPL es la abreviatura de Before C Programming Language y es una antigua (diseñada en 1966), lenguaje sin letra donde todo es palabra. En esa situación, la notación húngara puede ayudar con la comprobación de tipo a simple vista.

Muchos años han pasado desde entonces ...

Esto es lo que la última Linux kernel documentation (a partir de 2016) dice (el mío negrita):

que codifica el tipo de una función en el nombre (por lo -llamado húngaro notación) tiene daño cerebral - el compilador conoce los tipos de todos modos y puede comprobar esos, y solo confunde al programador.

Tenga en cuenta también que hay dos tipos de notación húngara:

  • sistemas de notación húngara: El prefijo codifica física tipo de datos.

  • notación Aplicaciones húngaro: El prefijo codifica lógica tipo de datos.

Sistemas La notación húngara ya no se recomienda debido a la redundancia de verificación de tipo, que a su vez se debe al avance en las capacidades del compilador. Sin embargo, aún puede utilizar aplicaciones de notación húngara si el compilador no verifica los tipos de datos lógicos por usted. Como regla general, la notación húngara es buena si y solo si describe la semántica que no está disponible de otra manera.