hungarian notation - ¿Qué significa el prefijo de la variable `m_`?
hungarian-notation (6)
Como se indica en las otras respuestas, m_
prefix se usa para indicar que una variable es un miembro de la clase. Esto es diferente de la notación húngara porque no indica el tipo de la variable sino su contexto.
Uso m_
en C ++ pero no en otros idiomas donde ''this'' o ''self'' es obligatorio. No me gusta ver ''esto->'' usado con C ++ porque desordena el código.
Otra respuesta dice que m_dsc
es "mala práctica" y "descripción"; es una "buena práctica", pero esta es una pista falsa porque el problema es la abreviatura.
Otra respuesta dice que al escribir this
aparece IntelliSense, pero cualquier IDE bueno tendrá una tecla de acceso rápido para mostrar IntelliSense para los miembros de la clase actual.
A menudo veo m_
prefix usado para variables ( m_World
, m_Sprites
, ...) en tutoriales, ejemplos y otro código relacionado principalmente con el desarrollo del juego.
¿Por qué la gente agrega el prefijo m_
a las variables?
Como se indica en muchas otras respuestas, m_ es un prefijo que denota variables miembro. Es / se usaba comúnmente en el mundo de C ++ y también se propagaba a otros idiomas, incluido Java.
En un IDE moderno, es completamente redundante ya que el resaltado de sintaxis hace evidente qué variables son locales y cuáles son miembros . Sin embargo, cuando apareció el resaltado de sintaxis a finales de los 90, la convención había existido durante muchos años y estaba firmemente establecida (al menos en el mundo de C ++).
No sé a qué tutoriales se refiere, pero supongo que están utilizando la convención debido a uno de estos dos factores:
- Son tutoriales en C ++, escritos por personas acostumbradas a la m_convention, y / o ...
- Escriben código en texto simple (monoespaciado), sin resaltado de sintaxis, por lo que la convención m_ es útil para aclarar los ejemplos.
El prefijo m_
se usa a menudo para las variables miembro: creo que su principal ventaja es que ayuda a crear una distinción clara entre una propiedad pública y la variable miembro privada que la respalda:
int m_something
public int Something
{
get { return this.m_something; }
}
Puede ayudar tener una convención de nomenclatura consistente para las variables de respaldo, y el prefijo m_
es una forma de hacerlo, una que funciona en idiomas que no distinguen entre mayúsculas y minúsculas.
Lo útil que esto es depende de los idiomas y las herramientas que está utilizando. Los IDE modernos con herramientas refactoriales fuertes e intellisense tienen menos necesidad de convenciones como esta, y ciertamente no es la única forma de hacerlo, pero vale la pena conocer la práctica en cualquier caso.
En Clean Code: Handbook of Agile Software Craftsmanship hay una recomendación explícita sobre el uso de este prefijo:
Tampoco es necesario que prefija las variables miembro con
m_
. Tus clases y funciones deberían ser lo suficientemente pequeñas como para que no las necesites.
También hay un ejemplo (código C #) de esto:
Mala práctica:
public class Part
{
private String m_dsc; // The textual description
void SetName(string name)
{
m_dsc = name;
}
}
Buena práctica:
public class Part
{
private String description;
void SetDescription(string description)
{
this.description = description;
}
}
Contamos con constructos de lenguaje para referirnos a las variables miembro en el caso de una ambigüedad explícita ( es decir , miembro de description
y parámetro de description
): this
.
Es una práctica común en C ++. Esto se debe a que en C ++ no se puede tener el mismo nombre para la función miembro y la variable miembro, y las funciones get se suelen nombrar sin el prefijo "get".
class Person
{
public:
std::string name() const;
private:
std::string name; // This would lead to a compilation error.
std::string m_name; // OK.
};
main.cpp:9:19: error: duplicate member ''name'' std::string name; ^ main.cpp:6:19: note: previous declaration is here std::string name() const; ^ 1 error generated.
"m_" indica para el "miembro". El prefijo "_" también es común.
No debe usarlo en lenguajes de programación que resuelven este problema usando diferentes convenciones / gramática.
Esta es una práctica de programación típica para definir variables que son variables miembro. Entonces, cuando los use más tarde, no necesita ver dónde están definidos para conocer su alcance. Esto también es excelente si ya conoce el alcance y está usando algo como intelliSense , puede comenzar con m_
y se muestra una lista de todas las variables de sus miembros. Parte de la notación húngara, consulte la parte sobre el alcance en los ejemplos aquí .