Je vois souvent le préfixem_
utilisé pour les variables (m_World
, m_Sprites
, ...) dans les tutoriels, exemples et autres codes principalement liés au développement de jeux.
Pourquoi les gens ajoutent-ils le préfixe m_
aux variables?
C'est une pratique de programmation typique pour définir des variables qui sont des variables membres. Ainsi, lorsque vous les utilisez plus tard, vous n'avez pas besoin de voir où ils sont définis pour connaître leur portée. C'est également très bien si vous connaissez déjà l'étendue et que vous utilisez quelque chose comme intelliSense, vous pouvez commencer par m_
et afficher une liste de toutes vos variables membres. Une partie de la notation hongroise, voir la partie sur la portée dans les exemples ici .
Dans Clean Code: Un manuel d'artisanat agile - il y a une recommandation explicite concernant l'utilisation de ce préfixe:
De plus, vous n'avez plus besoin de préfixer les variables membres avec
m_
. Vos cours et fonctions doivent être suffisamment petits pour que vous n'en ayez pas besoin.
Il y a aussi un exemple (code C #) de ceci:
Mauvaise pratique:
public class Part
{
private String m_dsc; // The textual description
void SetName(string name)
{
m_dsc = name;
}
}
Bonnes pratiques:
public class Part
{
private String description;
void SetDescription(string description)
{
this.description = description;
}
}
Nous comptons avec les constructions de langage pour faire référence à des variables de membre en cas d'ambiguïté explicite (i.e., description
member et description
paramètre): this
.
Le préfixe m_
est souvent utilisé pour les variables membres. Je pense que son principal avantage est qu’il permet de faire une distinction claire entre une propriété publique et la variable membre privée la sauvegardant:
int m_something
public int Something => this.m_something;
Il peut être utile d’avoir une convention de dénomination cohérente pour les variables de sauvegarde, et le préfixe m_
en est un moyen - une méthode qui fonctionne dans les langues ne respectant pas la casse.
Son utilité dépend des langues et des outils que vous utilisez. Les IDE modernes dotés de puissants outils de refactorisation et d’intelliSense ont moins besoin de conventions comme celle-ci, et ce n’est certainement pas la seule façon de procéder, mais il est utile d’être au courant de cette pratique.
C'est une pratique courante en C++. En effet, en C++, vous ne pouvez pas avoir le même nom pour la fonction membre et la variable membre et les fonctions getter sont souvent nommées sans le préfixe "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_" indique le "membre". Le préfixe "_" est également courant.
Vous ne devriez pas l'utiliser dans des langages de programmation qui résolvent ce problème en utilisant différentes conventions/grammaires.
Comme indiqué dans les autres réponses, le préfixe m_
indique qu'une variable est un membre du groupe. Ceci est différent de la notation hongroise car elle n'indique pas le type de la variable mais son contexte.
J'utilise m_
en C++ mais pas dans d'autres langues où 'this' ou 'self' est obligatoire. Je n'aime pas voir 'this->' utilisé avec C++ car cela encombre le code.
Une autre réponse indique que m_dsc
est "mauvaise pratique" et "description;" C’est une "bonne pratique", mais c’est une mauvaise idée car le problème est l’abréviation.
Une autre réponse indique que la saisie this
affiche IntelliSense mais que tout bon IDE aura un raccourci clavier pour afficher IntelliSense pour les membres actuels du groupe.
Pour compléter les réponses actuelles et comme la question n’est pas spécifique à une langue, certains projets C utilisent le préfixe m_
pour définir les variables globales spécifiques à un fichier - et g_
pour les variables globales dont la portée est plus grande que le fichier qu’elles ont été définies.
Dans ce cas, les variables globales définies avec le préfixe m_
doivent être définies comme suit: static
.
Voir Convention de codage EDK2 (implémentation UEFI Open-Source) pour un exemple de projet utilisant cette convention.
Comme indiqué dans de nombreuses autres réponses, m_ est un préfixe qui désigne les variables membres. Il est/était couramment utilisé dans le monde C++ et propagé à d'autres langages, y compris Java.
Dans un IDE moderne, il est complètement redondant car la coloration syntaxique met en évidence les variables qui sont local et celles qui sont membres . Toutefois, lorsque la mise en évidence de la syntaxe temporelle est apparue à la fin des années 90, la convention existait déjà depuis de nombreuses années et était fermement définie (du moins dans le monde C++).
Je ne sais pas à quels tutoriels vous faites référence, mais je devinerai qu'ils utilisent la convention en raison de l'un des deux facteurs suivants:
Un argument que je n'ai pas encore vu est qu'un préfixe tel que m_
peut être utilisé pour éviter les conflits de noms avec les macro #define
'd.
Recherche regex pour #define [a-z][A-Za-z0-9_]*[^(]
dans /usr/include/term.h
à partir des curses/ncurses.