web-dev-qa-db-ja.com

メンバー変数にはどのようなプレフィックスを使用しますか?

間違いなく、コードを理解するには、メンバー変数にプレフィックスを付けて、「通常の」変数と簡単に区別できるようにすることが不可欠です。

しかし、どのようなプレフィックスを使用しますか?

私は接頭辞としてm _を使用したプロジェクトに取り組んできましたが、他のプロジェクトではアンダースコアのみを使用しました(アンダースコアだけでは十分な説明がないため、個人的には好きではありません)。

別のプロジェクトでは、変数タイプも含まれる長いプレフィックス形式を使用しました。 mul _たとえば、タイプ nsigned l ongのm ember変数のプレフィックスです。

次に、使用しているプレフィックスの種類を教えてください(理由を教えてください)。

EDIT:ほとんどの人は、メンバー変数に特別なプレフィックスを付けずにコーディングしているようです!これは言語に依存しますか?私の経験から、C++コードはアンダースコアまたはm _をメンバー変数のプレフィックスとして使用する傾向があります。他の言語はどうですか?

32
Thomas Koschel

間違いなく、コードを理解するには、メンバー変数にプレフィックスを付けて、「通常の」変数と簡単に区別できるようにすることが不可欠です。

私はこの主張に異議を唱えます。半ばまともな構文の強調表示がある場合、それは少なくとも少し必要ではありません。優れたIDEは、コードを読みやすい英語で記述し、他の方法でシンボルのタイプとスコープを表示できます。Eclipseは、次の場合にシンボルの宣言と使用法を強調表示することで、優れた機能を果たします。挿入ポイントはそのうちの1つにあります。

編集、スリムに感謝:Eclipseのような優れた構文ハイライトを使用すると、太字または斜体のテキストを使用したり、フォントを完全に変更したりすることもできます。たとえば、静的なもののイタリックが好きです。

別の編集:このように考えてください。変数のタイプとスコープは二次情報です。それは利用可能で見つけやすいはずですが、あなたに叫んではいけません。 m_のようなプレフィックスまたはLPCSTRのようなタイプを使用する場合、主要な情報(コードの意図)を読みたいだけのときにノイズになります。

3番目の編集:これは言語に関係なく適用されます。

53
Kevin Conner

プレフィックスは一切使用していません。ローカル変数またはメソッドパラメーターをクラスメンバーと混同する危険に遭遇した場合、メソッドまたはクラスのいずれかが長すぎて、分割することでメリットが得られます

これは(おそらく)コードをより読みやすく、いくらか「流暢」にするだけでなく、最も重要なことです適切に構造化されたクラスとメソッドを奨励します。したがって、最終的には、接頭辞または接頭辞なしのディレマとはまったく異なる問題に要約されます。

更新:そうですね、好みや好みは変わりますね。長期的にはローカル変数とメンバー変数を認識するのに有益であることが証明されているので、メンバー変数のプレフィックスとしてアンダースコアを使用します。特に新しいチームメンバーは、2人が簡単に認識できないときに苦労することがあります。

46
petr k.

無し。以前はアンダースコアを使用していましたが、他の人がアンダースコアを気に入らず、見逃していないプロジェクトでアンダースコアについて話されました。まともなIDEまたはまともなメモリは、メンバー変数とは何か、そうでないものを教えてくれます。私たちのプロジェクトの開発者の1人は、すべてのメンバー変数の前に「this」を置くことを主張しています。名目上「彼」であるコードの領域に取り組んでいるとき、私たちは彼をユーモアを交えます。

42
Paul Tomblin

アンダースコアのみ。

私の場合、それを使用しているのは、それが私の職場でのコーディング標準文書に書かれていることだからです。ただし、変数の先頭にm_や恐ろしいハンガリー語を追加する意味がわかりません。ミニマリストの「アンダースコアのみ」は、読みやすくします。

21
Matt Howells

何よりも一貫性を保つことが重要なので、あなたとあなたのチームメートが同意できるものを選び、それに固執します。また、コーディングしている言語に規則がある場合は、それに固執するようにしてください。一貫性のないプレフィックスルールに従うコードベースほど混乱するものはありません。

C++の場合、コンパイラのキーワードの前に_が付いていることがあるという事実に加えて、_よりもm_を好む別の理由があります。 mはメンバー変数を表します。これにより、ローカル変数と他のクラスの変数(静的の場合はs_、グローバルの場合はg_)を明確にすることができます(ただし、もちろんグローバルは使用しないでください)。

IDEが常にあなたの面倒を見るというコメントに関しては、IDEは本当にあなたがあなたのコードを見ている唯一の方法ですか? diffツールはIDEと同じレベルの構文ハイライトの品質を持っていますか?ソース管理リビジョン履歴ツールはどうですか?ソースファイルをコマンドラインにキャットすることさえありませんか?最新のIDEは素晴らしい効率ツールですが、コードは簡単でなければなりません読んでいるコンテキストに関係なく読んでください。

20
fastcall

私はthisキーワードを使用することを好みます。つまり、コミュニティに依存する名前の代わりに、this.dataまたはthis->dataを意味します。

理由:

  • 最近のIDEではthis.ポップアップintellinsenseと入力しています
  • 定義された命名を知らなくても誰にでも明らかです

ところで、変数のタイプを示す文字を前に付けると、優れたIDEでは時代遅れになり、これを思い出します Joelの記事

12
Jakub Kotrla

'm_'はC++からの遺産であるため、C#を使用して、 'm _'-プレフィックスからアンダースコアのみに移動しました。

公式のMicrosoftガイドラインでは、プレフィックスを使用せず、プライベートメンバーではキャメルケースを使用およびパブリックメンバーではPascal-caseと規定しています。問題は、これが同じソースからの別のガイドラインと衝突することです。これは、すべてのコードを.NETで使用されるすべての言語と互換性があるようにする必要がありますと述べています。たとえば、VB.NETはケーシング間で違いはありません。

だから私にとってはアンダースコアです。これにより、IntelliSenseを介したアクセスも簡単になり、パブリックメンバーのみを呼び出す外部コードでは、視覚的に乱雑なアンダースコアを確認する必要がなくなります。

更新:C# "this。"-prefixが「私」を助けるとは思わない。 VBでは、「Me.age」は「Me.Age」と同じように表示されます。

6
Seb Nilsson

前の応答でRobが言ったように、m_を使用してから、わずかに変更されたSimonyi表記を使用します。したがって、接頭辞は便利なようで、m_はあまり煩わしくなく、簡単に検索できます。

なぜ表記なのか?そして、名前の大文字と小文字を区別するMicrosoft表記の推奨事項(.NETの場合)に従わないのはなぜですか?

最初の後半の質問:指摘したように、VB.NETはケーシングに無関心です。データベースと(特に)DBAもそうです。 customerIDとCustomerID(たとえば、C#)をまっすぐに保つ必要があると、脳が痛くなります。したがって、ケーシングは表記法の形式ですが、あまり効果的なものではありません。

プレフィックス表記には、いくつかの点で価値があります。

  1. IDEを使用せずにコードの人間の理解を高めます。コードレビューのように-私はまだ最初は紙で行うのが最も簡単だと思います。
  2. T-SQLまたは他のRDBMSストアドプロシージャを作成したことがありますか?データベースの列名にプレフィックス表記を使用すると、特にこの種のテキストエディタを使用するのが好きな人にとっては非常に役立ちます。

要するに、スマートIDEが利用できない開発環境がまだあるので、表記の形式としてプレフィックスを付けると便利です。 IDE(ソフトウェアツール)は、いくつかのショートカット(インテリセンスタイピングなど)を許可しますが、開発環境全体を構成するものではないと考えてください。

IDEは、自動車が交通ネットワークであるのと同じように統合開発環境です。より大きなシステムの一部にすぎません。滞在するような「自動車」の慣習に従いたくありません。マークされた道路では、空き地を歩くだけの方が速い場合があります。変数の入力を追跡するためにIDEに依存することは、空き地を歩くために車のGPSが必要になるようなものです。もちろん、小さな変更のたびに車に戻るよりも、ポータブルな形式で知識を持っている(「m_intCustomerID」を持っているのは厄介かもしれませんが)。

とはいえ、m_規則または「this」規則はどちらも読み取り可能です。 m_は簡単に検索でき、変数の入力もそれに続くことができるので、私たちはm_が好きです。プレーンアンダースコアが他の多くのフレームワークコードアクティビティで使用されていることに同意しました。

6
Eric

使用しているフレームワークによって異なります。 MFCコードを記述している場合は、m _とハンガリアン記法を使用します。他のもの(STL/Boostになる傾向があります)については、すべてのメンバー変数にアンダースコア接尾辞を追加し、ハンガリアン記法を気にしません。

MFCクラス

class CFoo  
{  
private:  
    int m_nAge;  
    CString m_strAddress;  
public:  
    int GetAge() const { return m_nAge; }  
    void SetAge(int n) { m_nAge = n; }  
    CString GetAddress() const { return m_strAddress;  
    void SetAddress(LPCTSTR lpsz) { m_strAddress = lpsz; }  
};

STLクラス

class foo  
{  
private:  
    int age_;  
    std::string address_;  
public:  
    int age() const { return age_; }  
    void age(int a) { age_ = a; }  
    std::string address() const { return address_; }  
    void address(const std::string& str) { address_ = str; }  
};

これは少し奇妙に思えるかもしれません-2つの異なるスタイル-しかしそれは私にとってはうまくいき、MFC自体と同じスタイルを使用しない多くのMFCコードを書くのは見苦しいだけです。

4
Rob

メンバー変数の前に「m」を付け、パラメーター(関数内)の前に「p」を付けます。したがって、コードは次のようになります。

class SomeClass {
    private int mCount;
    ...
    private void SomeFunction(string pVarName) {...}
}

これにより、変数の基本的なスコープがすぐにわかります。プレフィックスがない場合は、ローカルです。また、関数を読み取るときに、何が渡されているのか、何がローカル変数であるのかを考える必要はありません。

4
goric

それは本当に言語に依存します。私はC++の人で、すべてにアンダースコアを付けるのは少し注意が必要です。言語は、場合によっては(スコープに応じて)実装用にアンダースコアで始まるものを予約します。二重下線、または大文字の後に続く下線には特別な扱いもあります。したがって、その混乱を避けて、他のプレフィックスを選択するだけです。 「m」は大丈夫ですIMO。 'm_'は少し多いですが、ひどいものでもありません。本当に好みの問題。

ただし、これらの_leadingUnderscoresには注意してください。コンパイラとライブラリの内部がそのように名付けられていることに驚かれることでしょう。特に注意しないと、事故や取り違えの余地が確実にあります。断ってよ。

3
Assaf Lavie

私は変人で、メンバー変数の前にクラス名(キャメルケース)のイニシャルを付けています。

TGpHttpRequest = class(TOmniWorker)
strict private
  hrHttpClient  : THttpCli;
  hrPageContents: string;
  hrPassword    : string;
  hrPostData    : string;

Delphiの人々のほとんどはFを使用しています。

TGpHttpRequest = class(TOmniWorker)
strict private
  FHttpClient  : THttpCli;
  FPageContents: string;
  FPassword    : string;
  FPostData    : string;
3
gabr

ほとんどの場合、私はPythonを使用しています。 Python現在のクラスのインスタンスの属性fooにアクセスするには、self.fooを使用する必要があります。こうすると、作業するインスタンスのローカル変数、パラメーター、および属性が混乱する問題が発生します。 onが解決されます。
一般的に、私はこのアプローチが好きですが、強制されるのは嫌いです。したがって、これを行うための私の理想的な方法は、それを行わず、メンバー変数をフェッチするために、これまたは自己に対して何らかの形式の属性アクセスを使用することです。そうすれば、名前をメタデータで乱雑にする必要がなくなります。

3
Tetha

言語がthisまたはMeキーワードをサポートしている場合は、プレフィックスを使用せず、代わりにそのキーワードを使用します。

3
moffdub

単一の_視覚的な指標としてのみ使用されます。 (C#)

  • メンバーをインテリセンスでグループ化するのに役立ちます。
  • コードを読むときにメンバー変数を見つけやすくなります。
  • ローカル定義でメンバー変数を非表示にするのは困難です。
2
Robert Paulson

私は接頭辞を使わない人々と一緒です。

最近のIDEは非常に優れているため、構文の色付け、マウスオーバーのツールチップ、簡単なナビゲーションからその定義まで、変数に関する情報を一目で簡単に見つけることができます。

これは、変数のコンテキストと命名規則(ローカル変数とプライベートフィールドの場合はlowerCamelCase、プロパティとメソッドの場合はUpperCamelCaseなど)、ブール値の場合は「hasXXXX」や「isXX」などから取得できるものに加えて行われます。

私は何年もプレフィックスを使用していませんが、以前は「これ」でした。モンスターの接頭辞ですが、どうしても必要な場合を除いて、私はそれをやめました(ありがとう、Resharper)。

2
David Moore

別のトリックは命名規則

すべてのメンバー変数は、接頭辞なしで通常どおりに名前が付けられます(または、「this。」はプロジェクトで通常そうすることです)

しかし、私のプロジェクトでは、これらのローカル変数には常に次の名前が付けられているため、ローカル変数と簡単に区別できます。

  • a何か:1つのオブジェクトを表します。
  • some ManyThings:オブジェクトのリスト。
  • is AStateまたはhas SomeThing:ブール状態の場合。

'a'、 'some'、または 'is/has'で始まらない変数はすべてメンバー変数です。

2
VonC

_の代わりにthis.

_の代わりにthis.も使用します。これは、短い4文字が少ない)であり、メンバー変数の優れた指標であるためです。さらに、このプレフィックスを使用すると、名前の競合を回避できます。例:

public class Person {
  private String _name;

  public Person(String name) {
    _name = name;
  }
}

これと比較してください:

public class Person {
  private String name;

  public Person(String name) {
    this.name = name;
  }
}

最初の例はより短く、より明確だと思います。

2
Igor Popov

VB.NETでは大文字と小文字が区別されないため、メンバー変数の前にアンダースコアを付け、残りの名前はキャメルケースにします。プロパティ名を大文字にします。

Dim _valueName As Integer

Public Property ValueName() As Integer
2
Tim

それはあなたがどの言語で働いているかによります。

C#では、「this」プレフィックスを使用して任意のメンバーを参照できます。 'this.val'は、プレフィックスが不要であることを意味します。 VBは 'Me'と同様の機能を備えています。

メンバーのアクセスを示すための組み込み表記がある言語では、プレフィックスを使用する意味がわかりません。他の言語では、その言語で一般的に受け入れられている規則を使用するのが理にかなっていると思います。

組み込み表記を使用する利点の1つは、クラスのプロパティやメソッドにアクセスするときに、それらの命名規則を損なうことなく使用できることです(これは、非プライベートメンバーにアクセスするときに特に重要です)。あらゆる種類のインジケーターを使用する主な理由は、クラスで起こりうる副作用を引き起こしていることを示すフラグとして使用するため、フィールド/プロパティ/メソッドなどであるかどうかに関係なく、他のメンバーを使用するときにそれを使用することをお勧めします。 。

1
Greg Beech

以前はC++でm_プレフィックスを使用していましたが、C#では、フィールドにキャメルケースを使用し、プロパティにパスカルケースを使用することを好みます。

private int fooBar;
public int FooBar
{
  get { return fooBar; }
  set { fooBar = value; }
}
1
user10178

ここでは多くのキャメルケースとアンダースコアを使用しています。 C#を使用していて、コンストラクターで「this」キーワードを回避することに慣れているため、アンダースコアを使用します。キャメルケースのメソッドスコープのバリアントなので、アンダースコアは、その時点で使用しているスコープを思い出させます。そうでなければ、コードですでに明らかな不要な情報を追加しようとしない限り、それは重要ではないと思います。

1
Daniel Crenna

私はm_が好きですが、コードベースで規則が使用されている限り、私はそれでかっこいいです。

1
Eric Schneider

あなたのmul_の例は、CharlesSimonyiのAppsHungarian表記に向かっています。

私は物事をシンプルに保つことを好みます、そしてそれが私が接頭辞としてm_を使うのが好きな理由です。

これを行うと、元の宣言を見るためにどこに行かなければならないかをはるかに簡単に確認できます。

0
Rob Wells

私はC++でm_を使用する傾向がありますが、JavaまたはC#で省略してもかまいません。コーディング標準によって異なります。アンダースコアとm_が混在するレガシーコードの場合コードを1つの標準にリファクタリングします(妥当なコードサイズが与えられた場合)

0
Thorsten79

私が使う @。

:D j/k-しかし、もしそうなら、言語に依存します。ゲッター/セッターがある場合、私は通常、プライベートメンバー変数の前に_を置き、ゲッター/セッターは_なしで同じ名前になります。それ以外の場合、私は通常何も使用しません。

0
chuck

Javaでは、一般的な規則の1つは、メンバー変数の前に「my」とUseCamelCaseForTheRestOfTheVariableNameを付けることです。

0
Matt J

私自身のプロジェクトでは、_をpostfixとして使用し(Martin Yorkが前述したように、プレフィックスとして_はコンパイラ実装のC/C++標準による予約です)、iは シンビアンプロジェクト で作業します。

0
Kasprzol