フィールドにプレフィックスを付けないのはなぜですか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/659552

質問

私はハンガリー語表記法のファンではありませんでした。本当に低レベルのプログラミングをしているのでなければ、かなり役に立たないことがわかりましたが、すべてのC ++プロジェクトでは、何らかのハンガリー語表記法に取り組んできました強制されており、「ハンガリー語ではない」プレフィックスをフィールドのm_、静的のs_、グローバルのg_などとして使用しています。

すぐに、C#にはどれほど役に立たないことに気付き、徐々に私の古い習慣をすべて落とし始めました...しかし、「m_」のことです。プライベートフィールドでm_プレフィックスを使用するのは、パラメーター、ローカル、フィールドを区別できると非常に便利だからです。

MSDNのフィールドページの命名規則はすべきではないが、その理由は述べていません(たとえば、Googleの規則は一般的に処方を合理化する傾向があります)。

私がすべきではない、または単にスタイルの問題である理由はありますか。後者の場合、プレフィックスは一般的に悪いスタイルと見なされますか?コードベースで作業している他の人からの否定的な反応を期待できますか?

役に立ちましたか?

解決

メンバーフィールドのアンダーバープレフィックスが好きです。ほとんどの場合、画面上部のウィザードバーでメソッドの前にすべてのメンバーフィールドがアルファベット順に表示されるため、気に入っています。

WizardBar

他のヒント

必要な場合:

  • プロジェクトのコーディングガイドラインで次のように指示されている場合

すべきではない場合:

  • プロジェクトのコーディングガイドラインで、行うべきでないと言われた場合

ガイドラインがまだない場合は、自分やチームが望むものを自由に選択して、最も快適に感じることができます。個人的にC ++をコーディングするとき、メンバーにm_を使用する傾向があります。他の言語、特に真のクラス(Javascript、Luaなど)のない言語でコーディングする場合、私はしません。

要するに、<!> quot; right <!> quot;があるとは思わない。 <!> quot; wrong <!> quot;方法。

C#3.0の自動実装プロパティ機能は、この規則の必要性を多少なりとも作ります。書く代わりに

string m_name;
public string Name { get { return m_name; } }

または

string _Name;
public string Name { get { return _Name; } }

(またはその他の規則)、あなたは今書くことができます

public string Name { get; private set; }

明示的なバッキングストア変数が不要になったため、変数の名前を考える必要がなくなりました。したがって、この議論全体を避けます。

明らかに、検証を実行するなど、明示的なバッキングストアが本当に必要な場合、この引数は適用されません。

一部の人が示唆しているように、MSガイドラインは次のように述べています。

  

フィールド名にプレフィックスを使用しないでください。   たとえば、g_またはs_を使用して   静的と非静的を区別する   フィールド。

私はたまたまこれに同意します。プレフィックスを使用すると、コードが見苦しくなり、重要でない文字でスペースが無駄になります。そうは言っても、フィールドとプロパティの両方が同じ名前を持つプロパティをサポートするためにフィールドを使用することがよくあります(プライベートフィールドはキャメルケース、プロパティはパスカルケースです)。 VBでは大文字と小文字が区別されないため、VBではこれは機能しません。このシナリオでは、単一の_プレフィックスの使用をお勧めします。これ以上でもそれ以下でもありません。見た目はすっきりしています。

m_、s _、_のみを試してみましたが、プレフィックスはまったくありません。すべての静的変数とインスタンス変数に_のみを使用することに決めました。静的変数とインスタンス変数を区別することは重要ではありません。理論的には良いように聞こえますが、実際には問題を引き起こすことはありません。

かつて同僚がすべてのプレフィックスを削除する説得力のある議論を行ったとき、1つのプロジェクトで試してみましたが、予想以上にうまく機能しました。私はそれを次のプロジェクトに持ち越し、<!> quot; interferes <!> quot;に悩まされました。インテリセンスで。次の状況がある場合

int foo;
public int Foo
{
  get { return foo; }
}

fooの入力を開始すると、インスタンス変数とプロパティの両方が提案されます。変数の前にアンダースコアを付けると、面倒な二重の提案がなくなるため、_のみを使用するように切り替えました。

MSDN .NETライブラリガイドラインに従うようにしています。これらには、命名ガイドラインセクションが含まれています。

明らかに、これらはプロジェクトのガイドラインの副次的なものです。

プロパティのバッキングフィールドをマークすることを好みます(すでに述べたように、.NET 3.0+は自動プロパティのおかげで必要性を減らします)が、アンダースコアでマークしますが、<!> quot; m <!> quot;はマークしません。 1つは、使用するときにInteliSenseリストの最上位に配置することです。

MSDNのガイドラインをブラッシュアップする必要があることは認めますが、最近は状況が急速に変化する可能性があります。

resharperのようなツールでは、接頭辞を付ける理由はありません。また、短いメソッドを記述する場合は、varがどこから来たのかを非常にすばやく知ることができるはずです。最後に、静的なものとそうでないものとの違いを伝える必要性は、実際にはできないのです。再シャーパーがなくても、おそらくコンパイラーによって保存されます。

私はいつも、あなたが述べたのと同じ理由で、メンバー変数の前に m _ を付け、静的変数の前に s _ を付けます。メンバー変数の前に下線を付ける人もいますが、これはいつも少し奇妙に見えます(しかし、それは単なる個人的な好みです)。

私が働いているほとんどの人はm_ / s_プレフィックスを使用しています。一貫している限り、あなたが何を使用するかはあまり重要ではないと思います。

私はそれらを決して使用しません。ずさんなコーディングを奨励します。 MSDNコーディングガイドライン、そこにあります。

ここに、_(m_ではなく)を使用するいくつかの理由があります。

(1)多くのBCL担当者は、MSの命名ガイドにもかかわらずそれを行っています。 (彼らのブログをチェックしてください。)それらの人はフレームワークを書いているので、良い習慣を持っています。コピーする価値があります。 MSDNで最も役立つサンプルコードのいくつかは、MSDNで作成されているため、アンダースコア規則を使用しています。これは事実上の業界標準です。

(2)単一のアンダースコアは、ソースを読み取るだけでメソッドおよびクラスレベルの変数を明確にするための、目立たないが控えめな方法です。読むときに、人々が新しい(または古い)コードを 一目で見る 理解するのに役立ちます。はい、マウスオーバーするとIDEでこれを確認できますが、強制されるべきではありません。テキストエディターで読むか、あえて言うと、紙で読みたい場合があります。

(3)メソッドが短くなるため、プレフィックスは必要ないと言う人もいますが、後で必要に応じてフィールドを自動実装プロパティに変更できます。しかし、現実の世界ではメソッドは必要な限り長く、フィールドとプロパティの間には重要な違いがあります(例:シリアル化と初期化)。

脚注:<!> quot; m <!> quot;ここでの使用法では、m_のメンバーは冗長ですが、これらの古い命名規則の多くのアイデアの1つは、タイプ名が大文字で始まり、インスタンス名が小文字で始まるというものだったため、小文字でした。 .NETには適用されないため、二重に冗長になります。また、ハンガリーの表記法は古いCコンパイラ(たとえば、整数またはポインターのキャストと算術)で役立つこともありましたが、C ++でさえクラスを扱うとその有用性は低下しました。

C ++とC#には1つの重要な違いがあります。ツールのサポートです。確立されたガイドライン(または一般的なバリエーション)に従うと、C ++にはなかった深いレベルのツールサポートが得られます。標準に従うことで、ツールは、他の方法では不可能だったより深いリファクタリング/名前変更操作を行うことができます。 Resharperはこれを行います。そのため、確立された標準のいずれかに固執します。

@John Kraftが述べているように、<!> quot; correct <!> quot;はありません。回答。 MattJが最も近い-常に会社のスタイルガイドラインに従う必要があります。ローマにいるときなど。

個人的な意見としては、ここで求められているので、完全にm_を捨てることに投票します。

最高のスタイルは、可視性に関係なくすべてのメンバーがPascalCased(つまり、privateメンバーであっても)で、すべての引数がcamelCasedであるスタイルだと思います。私はこのスタイルを壊しません。

プロパティバッキングストアフィールドにプレフィックスを付けるという要望を理解できます。結局、フィールドとプロパティを区別する必要がありますよね?同意する必要があります。ただし、後修正を使用します。

m_MyProperty(または私が見たことがあり、かつて一度宣伝したことのある_MyProperty)の代わりに、MyPropertyValueを使用します。読みやすく理解しやすく、さらに重要なことは、インテリセンスの元のプロパティ名に近いことです。

最終的に、それが私が後置を好む理由です。インテリセンスを使用してMy <down-arrow> <tab>にアクセスする場合は、通常<>> quot; MyProperty <!> quot;と入力します。 。 IntelliSenseを使用してm_My <tab>にアクセスする場合は、<!> quot; <=> <!> quot;と入力する必要があります。

それは、キーストローク経済についてです、私の意見では。

これを行うことはありません。その理由は、メソッドを短くすることです。画面全体でメソッド全体を見ることができれば、パラメーターを見ることができ、ローカルを見ることができるので、クラスが所有しているものと、パラメーターまたはローカルが何であるかを知ることができます。

通常、特定の表記法を使用してparamsおよびlocalsに名前を付けますが、常にではありません。矛盾がなければ私は何もしません。私は自分のメソッドが短いという事実に依存し、X、Y、ZがXのみを実行する必要があるときにそれらを実行しないようにします。

とにかく、それは私の2セントです。

コードを編集するためにviまたはEmacsにこだわらない限り、IDEがメンバーの差分表示を処理するため、特別な規則はほとんど使用しません。これは、Iを使用したインターフェイスまたはCを使用したクラスのプレフィックスにも適用されます。

誰か、インターフェイスのIプレフィックスの.NETスタイルを説明してください。 :)

私が慣れているのは、プライベートプロパティが小さなアンダースコアf.ex <!> quot; string _name <!> quot;になったことです。パブリックなものは<!> quot; Name <!> quot;を得ました。メソッド内の入力変数は小文字<!> quot; void MyMethod(string name)<!> quot;。

静的なconstを取得した場合、しばしば大きな文字で書かれます。 static const MYCONST = "hmpf"

選択肢が与えられるたびに、私はハンガリーのいぼを使用しません。これは余分なタイピングであり、意味のある情報を伝えません。優れたIDE(および、この機能の存在に基づいて<!> quot; good <!> quot;を定義します)を使用すると、静的メンバー、インスタンスメンバー、メンバー関数、型などに対して異なる構文強調表示を使用できます。 IDEが提供できる情報でコードを乱雑にする理由はありません。これは、コメント化された古いコードでコードが乱雑にならないようにするための結果です。バージョン管理システムがそのことを担当する必要があるためです。

最良の方法は、標準について同僚と同意し、それに固執することです。必ずしもすべての人に最適な方法である必要はありません。1つの方法に同意することは、実際に同意する方法よりも重要です。

コード標準として選択したのは、メンバー変数のプレフィックスとして_を使用することです。その理由の1つは、インテリセンスでローカル変数を見つけやすくすることでした。

この標準に同意する前に、別の標準を使用しました。プレフィックスをまったく使用せず、メンバー変数を使用していることを示すためにコードにthis.memberVariableを記述しました。

C#3のプロパティの短縮形を使用すると、明示的でないメンバー変数を使用していることがわかります。

公式のガイドラインに最も近いのは、 StyleCop です。これは、Microsoftが自動分析できるツールですソースファイルを作成し、推奨されるコーディングスタイルから違反を検出し、Visual StudioやMSBuildなどの自動ビルドから実行できます。

これをプロジェクトで使用し、開発者間でコードスタイルとレイアウトの一貫性を高めるのに役立ちますが、慣れるには少し時間がかかることに注意してください!

質問に答えるために-ハンガリー語表記もm_のような接頭辞も許可しません(実際、アンダースコアの使用は許可しません)。

このスタイルはもう使用しません。変数がどのように使用されているかをすばやく確認できるように開発されました。新しい開発環境では、変数の上にマウスを置くと、その情報を見ることができます。これらの新しいツールを使用すれば、その必要性はなくなりました。

C ++コーディング標準 Sutter、Herb および Alexandrescum Andrei 、2004年)から収集する洞察もあるかもしれません。アイテム#0には<!> quotというタイトルが付いています。小さなものに汗をかかないでください。 (または:標準化しないものを知ってください。)<!> quot;。

彼らは<!> quot;と言って、この特定の質問に少し触れます。自分の命名規則を決定できない場合は、...プライベートメンバー変数 likeThis _ ... < !> quot; (先頭のアンダースコアの使用は、C ++の非常に特定のルールに従うことを忘れないでください。)

ただし、そこに到達する前に、一定レベルの一貫性を強調します<!> quot; ...重要なことは、ルールを設定することではなく、ファイル内で既に使用されているスタイルと一貫性を保つことです... <!>引用;

C / C ++の表記法の利点は、宣言を検索しなくても、シンボルのタイプが簡単にわかるようにすることでした。これらのスタイルは、Intellisenseおよび<!> quot; Go to Definition <!> quot;が登場する前に登場しました。 -多くの場合、ヘッダーファイルの数を誰が知っているかを宣言するために、ガチョウを追わなければなりませんでした。大規模なプロジェクトでは、これはCのソースコードを見ると十分に悪い面倒ですが、アセンブリ+ソースコードと生の呼び出しスタックを使用してフォレンジックを行うとさらに悪くなります。

これらの現実に直面したとき、m_およびその他のすべてのハンガリーのルールを使用すると、見慣れないコードを見るときにシンボルのタイプを検索するだけでどれだけの時間を節約できるのか、メンテナンスのオーバーヘッドでも意味を持ち始めます。もちろん、Intellisenseと<!> quot; Go to Definition <!> quot;があるので、その命名規則の主な時間節約の動機はもうありません。私はそれをすることにそれ以上の意味があるとは思わない、そして私は一般にただ一貫性があり、そして多分もう少しのツールサポートを得るために.NETライブラリガイドラインに従って行くことを試みる。

私はこれにflameすることになると確信していますが、そうしてください。

Microsoftの.NETライブラリガイドラインと呼ばれますが、実際にはブラッドエイブラムスのビュー(こちらのドキュメント)-他にも正当な理由のあるビューがあります。

人々は、特定のスタイルについて十分な理由があるのではなく、多数派の意見を支持する傾向があります。

重要な点は、特定のスタイルがなぜ使用され、なぜ他のスタイルよりも好まれるのかを評価することです-つまり、誰もがやるべきことだと言うだけでなく、スタイルを選択する理由があります- / p>

古いスタイルのハンガリー語を使用しない基本的な理由は、略語を使用することでした。略語はチームごとに異なり、習得が困難でした。これは、省略しないことで簡単に解決できます。

利用可能な開発ツールが変わると、スタイルは最も意味のあるものに変わりますが、スタイル項目ごとに確固たる理由があります。

スタイルガイドラインとその理由を以下に示します。スタイルを改善して、より信頼性が高く、保守しやすいコードを作成する方法を常に探しています。

変数の命名規則

私たちはすべて、変数の命名規則に関する見解を持っています。簡単に保守可能な品質のコードを生成するのに役立つさまざまなスタイルがあります。変数に関する基本的な基本情報をサポートするスタイルは問題ありません。特定の命名規則の基準は、信頼性が高く保守が容易なコードの作成を支援することです。使用すべきでない基準は次のとおりです。 それは醜いです Microsoft(つまりBrad Abrams)は、そのスタイルを使用しないと言います。Microsoftは、Expression Blendのバグを見るだけで、常に最も信頼できるコードを生成するとは限りません。 コードを読むとき、変数名が変数に関する3つの重要な事実を即座に伝えることが非常に重要です。 it <!>#8217; sスコープ  it <!>#8217; sタイプ 使用目的について明確に理解する 範囲:マイクロソフトは、IntelliSenseに完全に依存することをお勧めします。 IntelliSenseは素晴らしいです。ただし、すべての変数の上にマウスを置いてそのスコープとタイプを確認することはありません。変数がスコープ内にないと想定すると、重大なエラーが発生する可能性があります。たとえば、参照変数がパラメーターとして渡され、ローカルスコープで変更された場合、メソッドが返された後も変更は望ましくない可能性があります。フィールドまたは静的変数がローカルスコープで変更されているが、それがローカル変数であると考える場合、予期しない動作が発生する可能性があります。したがって、変数を(マウスオーバーではなく)見て、すぐにそのスコープを知ることができることが非常に重要です。

スコープを示すための次のスタイルが推奨されます。ただし、変数のスコープを明確かつ一貫して示す限り、どのスタイルでも完全に問題ありません。 m_フィールド変数 メソッドに渡されるp_パラメーター s_静的変数         ローカル変数 タイプ:特定のタイプを実際に使用しているときに特定のタイプを使用していると考えている場合、重大なエラーが発生する可能性があります-繰り返しますが、タイプを決定するために変数にマウスを重ねるだけではなく、タイプを知っていると仮定しますであり、それがエラーの作成方法です。

略語:略語は、開発者ごとに異なることを意味するため、悪意があります。ある開発者は、主要な小文字の<!> quot; s <!> quot;は文字列を意味し、別の人はそれが符号付き整数を意味すると考えるかもしれません。略語は怠codingなコーディングの兆候です。少し時間がかかり、フルネームを入力して、コードを維持する必要がある開発者にわかりやすくします。たとえば、<!> quot; str <!> quot;および<!> quot; string <!> quot; 3文字だけですters-コードを保守しやすくするためにそれほど労力はかかりません。

組み込みデータ型の一般的で明確な略語のみ使用できますが、チーム内で標準化する必要があります。

自己文書化コード:変数名に明確な説明を追加すると、別の開発者がコードを非常に簡単に読んで理解できるようになります-開発者でなくてもチームマネージャーがコードを読んで理解できるほどわかりやすい名前にしてください。

変数名部分の順序:推奨される順序は、次の理由によりscope-type-descriptionです。 IntelliSenseはすべての同様のスコープをグループ化し、各スコープ内でIntelliSenseはすべての同様のタイプをグループ化するため、ルックアップが容易になります-他の方法で変数を見つけてみてください スコープの表示と理解、およびタイプの表示と理解が非常に簡単になります。 かなり一般的なスタイルでわかりやすい FxCopを渡します

例:以下に例を示します。 m_stringCustomerName p_stringCustomerDatabaseConnectionString intNumberOfCustomerRecordsまたはiNumberOfCustomerRecordsまたはintegerNumberOfCustomerRecords これらの単純なルールにより、コードの信頼性と保守性が大幅に向上します。

制御構造の単一行ステートメント すべての制御構造(if、while、forなど)の単一行ステートメントは常に中括弧で囲む必要があります。特定のステートメントが制御ロジックに属していることを認識せずに新しいステートメントを追加するのは非常に簡単で、コンパイル時エラーを生成します。

メソッド例外ラッピング すべてのメソッドは、外部のtry-catchでラップする必要があります。このtry-catchは、回収、識別、検索、ログ記録、およびスローするかどうかの決定を行う場所を提供します。これは、アプリケーションをクラッシュさせる予期しない例外です。未処理の例外をすべてトラップするすべてのメソッドをラップすることにより、すべての例外の識別と記録を保証し、アプリケーションのクラッシュを防ぎます。少し手間がかかりますが、結果は努力する価値があります。

インデント インデントは大きな問題ではありません。ただし、タブを使用しない4つのスペースをお勧めします。コードを印刷する場合、通常、最初のプリンタータブはデフォルトで8スペースになります。開発者が異なれば、異なるタブサイズを使用する傾向があります。 Microsoftのコードは通常4スペースインデントされているため、Microsoftコードを使用し、4スペース以外を使用する場合は、コードを再フォーマットする必要があります。 4つのスペースにより、簡単で一貫性が保たれます。

特定のガイドラインに従ってコーディングしていない場合は、実際のm_表記を使用し続け、プロジェクトのコーディングガイドラインに明記されている場合はそれを変更する必要があります。

機能します。

  • グローバル変数を使用しないでください。
  • 静的変数を使用しないでください。
  • メンバー変数を使用しないでください。

本当に必要な場合は、本当に必要な場合にのみ、1つの変数を使用してアプリケーション/環境にアクセスします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top