web-dev-qa-db-fra.com

Que signifie le préfixe de la variable `m_`?

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?

103
kravemir

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 .

77
MichaelHouse

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.

58
InfZero

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.

10
Keith

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.

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

"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.

8
doc

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.

5
Quentin 2

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. 

1
OlivierM

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: 

  • Ce sont des tutoriels C++, écrits par des personnes habituées à la convention m_, et/ou ...
  • Ils écrivent du code en texte clair (monospace), sans mise en surbrillance de la syntaxe. La convention m_ est donc utile pour rendre les exemples plus clairs. 
1
sergut

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.

0
YoYoYonnY