チュートリアル、例、および主にゲーム開発に関連するその他のコードで、m_
変数(、、...)に使用される接頭辞をよく見ます。m_World
m_Sprites
なぜ人々はm_
変数にプレフィックスを追加するのですか?
m_
目的は明確ですが、ここでの回答の半分は、現在のお気に入りが最高だと考える理由についての解説です。
チュートリアル、例、および主にゲーム開発に関連するその他のコードで、m_
変数(、、...)に使用される接頭辞をよく見ます。m_World
m_Sprites
なぜ人々はm_
変数にプレフィックスを追加するのですか?
m_
目的は明確ですが、ここでの回答の半分は、現在のお気に入りが最高だと考える理由についての解説です。
回答:
これは、メンバー変数である変数を定義するための典型的なプログラミング方法です。したがって、後でそれらを使用するときに、それらのスコープを知るためにそれらが定義されている場所を確認する必要はありません。これは、すでにスコープがわかっていて、intelliSenseのようなものを使用している場合にも最適です。最初に、m_
すべてのメンバー変数のリストが表示されます。ハンガリー語表記の一部。ここの例のスコープに関する部分を参照してください。
m_
どちらかで始まるメンバー変数を作成することを実際に強制することはできません。
でクリーンコード:アジャイルソフトウェアクラフトマンシップの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
。
これは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.
「メンバー」の「m_」状態。接頭辞「_」も一般的です。
異なる規則/文法を使用してこの問題を解決するプログラミング言語では使用しないでください。
m_
接頭辞は、多くの場合、メンバ変数のために使用されている-私は、その主な利点は、それが公共の財産を明確に区別して、それを裏付けプライベートメンバ変数を作成するのに役立ちますということだと思います。
int m_something
public int Something => this.m_something;
これは、バッキング変数に一貫した命名規則を持たせるのに役立ちます。m_
プレフィックスは、大文字と小文字を区別しない言語で機能する方法の1つです。
これがどれほど役立つかは、使用している言語とツールによって異なります。強力なリファクタリングツールとインテリセンスを備えた最新のIDEは、このような規則の必要性が少なく、これが唯一の方法ではないことは確かですが、どのような場合でもその習慣を知っておく価値があります。
this.
あなたの言語で書かなければならないなら、それm_
は本当に役に立たない。
m_
そう-それはバックアッププロパティからそれを区別するためであるthis.Something
対プロパティのthis.m_something
バッキングメンバーのため。これは私が好む規則ではありませんが、ほとんどの場合、大文字と小文字を区別しない言語(VBなど)で使用されるのを見てきました。
this.Something
プロパティとthis.something
バッキングのため?またはthis._something
バッキングのために?this.m_something
冗長です。_something
タイプするときに誤って入力しないように使用Something
します。メンバーシップとは関係ありません
_
それ自体の接頭辞はそれで十分m_
ですが、慣習です。私が個人的に使用するものではありませんが、コードでそれを見ると、それは著者の意図でした。
他の回答で述べたように、m_
接頭辞は、変数がクラスメンバーであることを示すために使用されます。これは、変数の型ではなくそのコンテキストを示すため、ハンガリー語の表記とは異なります。
私m_
はC ++で使用していますが、「これ」または「自分」が必須である他の一部の言語では使用していません。'this->'がC ++で使用されるのは、コードが煩雑になるため、見たくありません。
別の答えはm_dsc
、「悪い習慣」と「説明」です。「良い習慣」ですが、略語に問題があるため、これは赤いニシンです。
別の回答では、入力this
するとIntelliSenseがポップアップ表示されますが、優れたIDEには現在のクラスメンバーのIntelliSenseをポップアップ表示するホットキーがあります。
m_description
対になりdescription
ます。
他の多くの応答で述べたように、m_はメンバー変数を示す接頭辞です。これはC ++の世界で一般的に使用されており、Javaを含む他の言語にも普及しています。
最近のIDEでは、構文の強調表示により、どの変数がローカルで、どの変数がメンバーであるかが明確になるため、完全に冗長です。ただし、構文の強調表示が90年代後半に登場するまでに、この規則は長年にわたって存在し、しっかりと設定されていました(少なくともC ++の世界では)。
あなたがどのチュートリアルを参照しているのかはわかりませんが、次の2つの要因のいずれかが原因で、これらの規則が使用されていると思います。
ロッキード・マーティンは、特に他の人のコードを読むときに、非常に素晴らしかった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*
}
それは価値があるもののためにそれを取る。
現在の回答を完了するために、質問は言語固有ではないため、一部のCプロジェクトは接頭辞m_
を使用して、ファイルに固有のグローバル変数を定義します- g_
定義されたファイルよりもスコープが大きいグローバル変数の場合。
この場合、プレフィックスm_
で定義されたグローバル変数はとして定義する必要がありますstatic
。
この規則を使用するプロジェクトの例については、EDK2(UEFIオープンソース実装)コーディング規則を参照してください。