`m_`変数プレフィックスは何を意味しますか?


154

チュートリアル、例、および主にゲーム開発に関連するその他のコードで、m_変数(、、...)に使用される接頭辞をよく見ますm_Worldm_Sprites

なぜ人々はm_変数にプレフィックスを追加するのですか?



18
ハンガリー語の表記法で不注意に訴訟を起こす前に、ハンガリー語の表記法が実際に何であるかについて履歴チェックを行ってください。int iCounterに名前を付けるのは無意味だからです。ただし、int xAnnotationPosおよびyAnnotationPosに名前を付けるのは妥当です。セマンティックバージョンを使用します。
AkselK 2012年

場合によっては、インポートされたモジュールが関数と変数にプレフィックスを付けるため、独自のコードでそれらを上書きする可能性が低くなります。これは、特定の用途のために名前を「予約」する方法です。
earthmeLon

3
「ハンガリー語」の表記はしばしば悪質に騙されますが、変数のスコープを示すその特定のフレーバーには、いくつかの本当の利点があります。変数のスコープを識別することに加えて、ローカル、パラメーター、およびメンバーがすべて同じ意図、つまり同じ「セマンティック」名を持っている場合のように、名前の衝突を防ぎます。これにより、大規模なコードベースのメンテナンスがより簡単になり、エラーが発生しにくくなります。
ホットリックス

8
コーディング標準には賛否両論がありますが、質問のm_目的は明確ですが、ここでの回答の半分は、現在のお気に入りが最高だと考える理由についての解説です。
2016

回答:


108

これは、メンバー変数である変数を定義するための典型的なプログラミング方法です。したがって、後でそれらを使用するときに、それらのスコープを知るためにそれらが定義されている場所を確認する必要はありません。これは、すでにスコープがわかっていて、intelliSenseのようなものを使用している場合にも最適です。最初にm_すべてのメンバー変数のリストが表示されます。ハンガリー語表記の一部。ここ例のスコープに関する部分を参照してください


51
これまでの命名規則に対する最悪の議論は、インテリセンスのためにctrl + spaceを押すだけです。
orlp

11
@nightcracker接頭辞は好きではありませんが、m_を入力して「CTRL + SPACE」(自動でない場合)を入力すると、メンバーのみを含むリストが表示されるという意味です。必ずしも正当な理由ではありませんが、それはプラスです。
Sidar

13
同じことを行うには、他にも多かれ少なかれ標準的な方法が他にもたくさんあることに言及する価値があります。「m_variable」、「m_Variable」、「mVariable」、「_ variable」、「_ Variable」...どちらが「最良」または「正しい」(またはそれを実行するか)は、「スペース対タブ」。:)
Trevor Powell、

49
私は単に「this->」を使用することを好みます。「m_」は冗長になり、コンパイラーによって強制されるため、さらに優れています(理論的には、任意の変数型で「m_」をポップできます。「this->」ではそれができません。 ")。私の一部は、C ++が「this->」を必須にすることだけで標準化することを望んでいます。しかし、それは答えというよりは議論の世界に向かっているのです。

3
@LaurentCouvidou、開発者がm_どちらかで始まるメンバー変数を作成することを実際に強制することはできません。
SomeWritesReserved 2012年

94

クリーンコード:アジャイルソフトウェアクラフトマンシップのAハンドブックこの接頭辞の使用に対する明示的な推奨事項があります:

また、メンバー変数にプレフィックスを付ける必要もありませm_ん。クラスと関数は、それらを必要としない程度に小さくする必要があります。

この例(C#コード)もあります。

悪い習慣:

public class Part
{
    private String m_dsc; // The textual description

    void SetName(string name)
    {
        m_dsc = name;
    }
}

いい練習:

public class Part
{
    private String description;

    void SetDescription(string description)
    {
        this.description = description;
    }
}

私たちは、明示的に曖昧(の場合のメンバ変数を参照するための言語構造とカウントすなわちdescriptionメンバーおよびdescriptionパラメータ): this


6
表現は、「この接頭辞の使用に対する明確な推奨事項があります:」
Xofo

私は、誰かがそれを書いたので、嬉しいです
dmitreyg

もう1つの理由は、Javaではgetter / setterがgetName / setNameであると想定されているため、getM_nameが不正であり、1つずつ処理する必要があるためです。
Leon

これを書いてくれてありがとう。あなたが引用した本が2008年8月から発行されていることを指摘したいと思います-そして、今日(2019)の新しいコードでは、この悪い習慣がまだ見つかります。
alexlomba87

20

これはC ++では一般的な方法です。これは、C ++ではメンバー関数とメンバー変数に同じ名前を付けることができず、ゲッター関数には「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_」状態。接頭辞「_」も一般的です。

異なる規則/文法を使用してこの問題を解決するプログラミング言語では使用しないでください。


11

m_接頭辞は、多くの場合、メンバ変数のために使用されている-私は、その主な利点は、それが公共の財産を明確に区別して、それを裏付けプライベートメンバ変数を作成するのに役立ちますということだと思います。

int m_something

public int Something => this.m_something; 

これは、バッキング変数に一貫した命名規則を持たせるのに役立ちます。m_プレフィックスは、大文字と小文字を区別しない言語で機能する方法の1つです。

これがどれほど役立つかは、使用している言語とツールによって異なります。強力なリファクタリングツールとインテリセンスを備えた最新のIDEは、このような規則の必要性が少なく、これが唯一の方法ではないことは確かですが、どのような場合でもその習慣を知っておく価値があります。


5
あなたがthis.あなたの言語で書かなければならないなら、それm_は本当に役に立たない。
ルスラン

@Ruslan m_そう-それはバックアッププロパティからそれを区別するためであるthis.Something対プロパティのthis.m_somethingバッキングメンバーのため。これは私が好む規則ではありませんが、ほとんどの場合、大文字と小文字を区別しない言語(VBなど)で使用されるのを見てきました。
キース

1
なぜ、this.Somethingプロパティとthis.somethingバッキングのため?またはthis._somethingバッキングのために?this.m_something冗長です。_somethingタイプするときに誤って入力しないように使用Somethingします。メンバーシップとは関係ありません
AustinWBryan

@AustinWBryanは、大文字と小文字を区別しない言語に関する以前のコメントを参照してください。ええ、_それ自体の接頭辞はそれで十分m_ですが、慣習です。私が個人的に使用するものではありませんが、コードでそれを見ると、それは著者の意図でした。
キース

7

他の回答で述べたように、m_接頭辞は、変数がクラスメンバーであることを示すために使用されます。これは、変数の型ではなくそのコンテキストを示すため、ハンガリー語の表記とは異なります。

m_はC ++で使用していますが、「これ」または「自分」が必須である他の一部の言語では使用していません。'this->'がC ++で使用されるのは、コードが煩雑になるため、見たくありません。

別の答えはm_dsc、「悪い習慣」と「説明」です。「良い習慣」ですが、略語に問題があるため、これは赤いニシンです。

別の回答では、入力thisするとIntelliSenseがポップアップ表示されますが、優れたIDEには現在のクラスメンバーのIntelliSenseをポップアップ表示するホットキーがあります。


「しかし、これは赤いニシンです」-良い点。公正な比較はm_description対になりdescriptionます。
バトル

3

他の多くの応答で述べたように、m_はメンバー変数を示す接頭辞です。これはC ++の世界で一般的に使用されており、Javaを含む他の言語にも普及しています。

最近のIDEでは、構文の強調表示により、どの変数がローカルで、どの変数がメンバーであるかが明確になるため、完全に冗長です。ただし、構文の強調表示が90年代後半に登場するまでに、この規則は長年にわたって存在し、しっかりと設定されていました(少なくともC ++の世界では)。

あなたがどのチュートリアルを参照しているのかはわかりませんが、次の2つの要因のいずれかが原因で、これらの規則が使用されていると思います。

  • それらは、m_慣習に慣れている人々によって書かれたC ++チュートリアル、および/または...
  • それらは構文強調表示なしでプレーン(等幅)テキストでコードを書くので、m_規約は例をより明確にするのに役立ちます。

たとえば 、wiki.qt.io / How_to_Use_QSettingsです。QtCreatorは強調表示を使用しているため、最初の推測が表示される場合があります。少し異なるのは、クラスのプライベートオブジェクトに_object()を使用する別の規則であり、ポインターである場合はp_variableを使用していることです。
イワノビッチ

3

ロッキード・マーティンは、特に他の人のコードを読むときに、非常に素晴らしかった3プレフィックスの命名方式を使用しています。

   Scope          Reference Type(*Case-by-Case)   Type

   member   m     pointer p                       integer n
   argument a     reference r                     short   n
   local    l                                     float   f
                                                  double  f
                                                  boolean b

そう...

int A::methodCall(float af_Argument1, int* apn_Arg2)
{
    lpn_Temp = apn_Arg2;
    mpf_Oops = lpn_Temp;  // Here I can see I made a mistake, I should not assign an int* to a float*
}

それは価値があるもののためにそれを取る。


驚くばかり。「例」をありがとう。200万行のコードを編集しているときに、それが本当に役に立ちます。
jiveturkey

1
防御する必要はありません。私は正直に答えに間違いがあることを示してあなたを助けようとしています。次に、もっとはっきりさせてください。コードが5行でも200000行でも問題ありません。コンパイラーは、互換性のないポインター型での割り当てを許可しません。したがって、コメントで指摘された点は、根拠のないものです。
カシオレナン

守備として外れるつもりはなかった。ごめんなさい。
jiveturkey

これはハンガリー語の表記法のバリエーションであり、現代の言語では意味がありません...
doc

2

現在の回答を完了するために、質問は言語固有ではないため、一部のCプロジェクトは接頭辞m_を使用して、ファイルに固有のグローバル変数を定義します- g_定義されたファイルよりもスコープが大きいグローバル変数の場合。
この場合、プレフィックスm_ で定義されたグローバル変数はとして定義する必要がありますstatic

この規則を使用するプロジェクトの例については、EDK2(UEFIオープンソース実装)コーディング規則を参照してください。


1

私がまだ見たことのない引数の1つは、などの接頭辞をm_使用して、#define「dマクロ」との名前の衝突を防ぐことができるということです。

以下のための正規表現検索#define [a-z][A-Za-z0-9_]*[^(]/usr/include/term.h呪い/ ncursesベースから。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.