マイクロソフトがパラメーター、ローカル変数、プライベートフィールドに同じ名前の命名規則を付けたのはなぜですか?


18

かなり前にこの質問をしました:C#でプライベート変数にどのように名前を付けますか?

回答の1つで、プライベート変数/フィールドは次のように命名する必要があることを示すMicrosoftのMSDNページを指摘されました。

private int myInteger;

ただし、パラメーターは次のようになります。

void SomeMethod(int myInteger)

ローカル変数は次のようになります。

int myInteger;

このように参照すると

myInteger = 10;

あなたが話しているものを知る方法はありません。

現在、私は新しいプロジェクトを開始していますが、同僚の1人が、少なくともこれらのいくつかを差別化するために何もしないのかと尋ねてきました。

私は同じことを疑問に思っています。なぜマイクロソフトの標準はこれらを異なっていなかったのですか?


10
「あなたが話しているものを知る方法がない」とはどういう意味ですか?もちろんそうです-スコープ。
トーマスオーエンズ

2
そのガイダンスは時代遅れのようで、再シャーパーのデフォルト(これは事実上のスタイルガイドのようなものになっています)では、プライベートフィールドの前にアンダースコアを付けることをお勧めします。

25
@kekekela:決して時代遅れではありません。StyleCopは、アンダースコアで始まるメンバー変数のインスタンスに明示的にフラグを立てます。率直に言って、ケーシングがまったく同じ情報を伝えるため、アンダースコアは無意味で迷惑です。スコープを明示的にする必要がある場合は、プレフィックスの割り当てにthis.
アーロンノート

12
@Aaronaught冗長な「これ」の束を見つけました。私のコードの周りに散らばっていて刺激的です。

12
@kekekela:私が唯一の場所、これまで自分がそれを行うために持っ見つけるコンストラクタであり、そしてあなたは、文字通りメンバーのフィールドを初期化した値で渡しているので、コンストラクタで、それは完璧な理にかなって(this.component = component)。他の場所に曖昧なスコープがあることに気付いた場合、「たくさんの冗長な「これ」があります。コードの周りに散らばっている」場合、コードの記述が不十分です。
アーロンノート

回答:


14

元の命名規則にはクラスメンバーのm_プレフィックスがありましたが、これは単純なアンダースコアに縮小されました。アンダースコアプレフィックスを使用した多くの古いC#Microsoftコードが表示されます。ただし、Tech Edで、先頭のアンダースコアがCLSに準拠していないと聞いたことがあります。私は、これが、より単純なone-name-fits-allスキームに移行した理由だと思います。以前は、VB.Netの大文字と小文字を区別しない名前もCLSに準拠していませんでした(今はわかりません)。

その価値のために、私はクラスのメンバーにまだ下線を使用しています。これ(名前ではなくthis.name)を使用して曖昧さをなくすことはできますが、バグは解決しません。

MSから指示されたすべてのことを行う必要はありません。


1
「CLR準拠」と「CLS準拠」を混同していると思います。何かがCLRに準拠していない場合、コンパイルされません。CLSは、他の言語との互換性がない可能性があるという単なる警告であり、基本的には公開メンバー(技術的には、アセンブリの外部に表示されるもの)のみに影響します。
ジョエルC

@ジョエル-あなたは正しい。この質問はそれを扱っています:stackoverflow.com/questions/1195030/…–
dave

2
私はまだ「m_」プレフィックスを使用しています...
CesarGon

4
+1「MSが指示することをすべて行う必要はありません」。自分で考えてください!
gbjbaanb

1
フィールドがprotectedである場合のみCLS準拠ではありませんprivate
レイチェル

9

localおよびparameter変数のスコープは同じであるため、変数の名前は同じです

プライベート変数については、それについてさまざまな意見があります。私は常にここにある標準を使用しましたが、これは_プライベート変数の前にリーディングを使用するように指定していますが、著者はこれ_は少し議論の余地があり、Microsoftはそれを推奨しないと述べています。

ウィキペディアによると、CおよびC ++

二重アンダースコアまたはアンダースコアと大文字で始まる名前は、実装(コンパイラ、標準ライブラリ)用に予約されているため、使用しないでください(__reservedまたは_Reserved)。

多くのマイクロソフトの開発者が_とにかくプライベート変数にプレフィックスを使用していることはかなりよく知られていますが、おそらくそれがマイクロソフトがそれを推奨する背後にある理由でした。


2
同じスコープ(+1)を持つパラメーターとローカル変数についての良い点。誰もそれについて言及していません その結果、パラメーターと同じ名前のローカル変数が必要な場合は、パラメーターのみを使用できます。個人的には、アンダースコアはくて不正確だと思います。一方、this間違いなく現在のオブジェクトを指します。に対する憎しみが分からないthis。誤解されているからですか?
ジェイソンS

4

なぜ彼らがそれらを異なって保持しなかったのか確かにあなたに言うことができない。標準の作成に参加した人が偶然この質問に出会わない限り、誰もできないでしょう。

多くの人は、インスタンス変数の前に_またはを付けて独自の規則を作成しますm_が、私はそれが本当に重要だとは思いません。コンテキストから多くのことを推測でき、最近のIDEはあなたを助けるのに十分スマートです。たとえば、ReSharperアドオンを備えたVisual Studioは、ローカル変数とインスタンス変数を異なる色で表示します。

2つのスコープを区別することが本当に重要な場合は、this.プレフィックスを使用してインスタンス変数を参照できます。

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

他のプラグインがない場合、Visual StudioはデフォルトでIntellisenseを支援します。

スクリーンショット

(ポップアップは依然としてReSharperによってスタイルが設定されている場合がありますが、ReSharperは組み込みのIntellisenseの機能に何も追加しません。そのため、標準のIntellisenseは少し違って見えるかもしれませんが、まだ両方のオプションがあります。 )

FxCopStyleCopなどのコード分析ツールを使用して、変数の名前付けとスコープに関する潜在的な問題をキャッチすることもできます。


少し詳しく説明するとthis、私は常にを好みますthis。なぜなら、あなたがどんな家にいても現在のインスタンスを確実に参照するからです。アンダースコアまたはアンダースコアmの規則は、インスタンス変数を参照する場合もしない場合もありますが、これらの規則は冗長thisです。アンダースコアが役立つと思う唯一の場所は、大文字と小文字を区別しないVBでオブジェクトとクラス名を区別することです。しかし、それはまったく別の話です。
ジェイソンS

4

なぜマイクロソフトの標準はこれらを異なっていなかったのですか?

Microsoftの人々はという本を書いたフレームワークの設計ガイドラインいくつかのものをされた理由を含む規則の数、説明ラクダは同棲をし、他の人がいたケース入りパスカル

編集(ブックから詳細を追加):

本の中で、彼らはユーザビリティ研究を行うことと、Turbo Pascalグループを買収することから学んだ教訓のいくつかに言及しています。また、すべての言語で大文字と小文字が区別されるわけではありませんが(VBなど)、他の言語では大文字と小文字が区別される(C#など)ため、名前は一貫している必要があります。アイテムを区別するために、ケースだけの違いに依存することはできません。フレームワークの残りの部分で使用されている規則に固執すると、開発者による混乱が少なくなります。

第3章、命名ガイドライン。
セクション3.1は大文字の表記規則です。

camelCasingパラメータ名用です。
PascalCasing名前空間、タイプ、およびメンバー名用です。名前の一部に2文字の頭字語がある場合は、大文字などのように大文字にしてくださいIOStream

セクション3.5では、クラス、構造体、インターフェイスの命名について説明します。
セクション3.6では、タイプメンバーの命名について説明します。
セクション3.7では、パラメータの命名について説明します。


4
この本を所有していない私たちのために要約してくれませんか?
Kramii復活モニカ

Kramiiに同意します。要約は素晴らしいでしょう!
ヴァッカーノ

@ Kramil、Vaccano、ライブラリからもう一度チェックアウトする必要があるようです。通常、私は新しい仕事を始めるときだけそうし、議論は命名とコーディング標準に変わります。
タングレナ

1
笑、「アイテムを区別するためだけにケースの違いに依存することはできません」と言い、その後、アイテムを区別するためにcamelCaseまたはPascalCaseを使用すると言います。
gbjbaanb

1

なぜなら、それらは記述されているコンテキストに依存しているため、かなり区別できるからです。

たとえば、パラメーターをメンバー変数として使用したことがありますか?または、パラメーターとしてのローカル変数?ローカル変数としてのメンバー変数はどうですか?

  • すべてのメンバー変数は、クラスの「本体」にあります。this似たような名前のローカル変数と区別するために使用できる場合は、メンバーにプレフィックスを付ける必要があるという議論は、私は本当に買いません。そうでなければ、必要ありません。

  • ローカル変数も、メソッドのスコープ内またはコードブロックスコープ内でのみ定義されます。

  • パラメーターは常にメソッドシグネチャで定義されます。

これらのタイプの変数をすべて混同したり混同したりする場合は、コード設計をより読みやすく、または見つけやすくするために、コード設計についてさらに検討する必要があります。それらよりもよく、より自己記述的な名前を付けmyIntegerます。


0

マイクロソフトの標準に関する質問に答えることはできません。あなたは標準ではこれらの事を区別したい場合は、PL / SQLパラメータの標準Iの使用はしてパラメータ名を前置されin_out_io_、、IN- OUT-、およびインOUT-パラメータについて。関数に対してローカルな変数には、接頭辞aが付きv_ます。


0

私が知っているほとんどの企業は、メンバー変数の接頭辞としてアンダースコアまたは小文字のm(「メンバー」と想定)を指定するコーディング標準を持っています。

そう

_varName

または

mVarName


2
はい。ただし、MSはメンバーにmを使用することを推奨していません。これは、OPが目指していることです。
クリストファービブス

「ほとんどの企業」には、この質問の対象であるマイクロソフトが含まれていません。
アーロンノート

1
Micrsoft MSDNがMicrosoftの内部コーディング標準用であることを知りませんでした。
ジェフ


0

他の人が指摘したように、通常、どのスコープがどのアイテムを使用しているのかを知ることができます。実際には、同じスコープにパラメーターとローカル変数を含めることはできません。プライベート変数が必要な場合は、this.myIntegerを使用してください。マイクロソフトは、必要に応じて簡単に区別できるため、それほど心配しているとは思わない。

しかし、それが言われているので、誰もまだこれを言っていないことに少し驚いていますが、Microsoftとその命名規則を忘れていますそれ)。ハンガリー語表記は、Microsoftで始まった命名規則でもありました(または、ゼロックスでしたか?Simonyiがいつ思いついたのか、私は決して思い出せません)。ハンガリー記法の名前を今日まで呪っていない私が知っている人は誰も思いつきません。私たちが働いていた場所で私たちはとてもイライラし、社内で使用する独自の標準を思いつきました。それは私たちにとってより理にかなっており、私たちの仕事を少しスピードアップしました(実際にはMicrosoftが現在提案しているものにかなり近かったですが、プライベート変数を除いてすべてがパスカルケースでした)。

そうは言っても、Microsoftが使用する新しい標準(ラクダケースとパスカルケースの混合)はそれほど悪くはありません。しかし、あなたとあなたの同僚がそれを気に入らないのであれば、あなた自身の標準のセットを考え出してください(集合的に最良です)。もちろん、これはあなたの会社が一連の標準をすでに持っているかどうかに依存します。もしそうなら、それらに固執します。そうでなければ、あなたとあなたの同僚のために働くものを考え出します。論理的に保つだけです。」

アーロンノートがチャールズ・シモニーとハンガリー記法についての引用を求めたので:http : //en.wikipedia.org/wiki/Charles_Simonyi

http://en.wikipedia.org/wiki/Hungarian_notation

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

最後の2つはハンガリー語表記の単なる例であり、ootipsリンクはその主題に関するいくつかの意見に関する引用です。システムハンガリー記法もありますが、私が知っている限りでは、Microsoftプログラマーからも人気がありました(アプリのバリエーションのSimonyiとは異なり、だれにもわかりません)。


1
1)ハンガリー語はマイクロソフトによって発明されたものではありません。2)言及している「ハンガリー語」は、意味論的なハンガリー語ではなくハンガリー語です。
アーロンノート

Microsoftがそれを思いついたとは決して言わなかった。チャールズ・シモニーがそれを思いついたと実際に言った(具体的にはアプリのハンガリー記法)。Microsoftはそれを強くプッシュしましたが、彼らがそれを作成したとは決して言いませんでした(実際、彼がXeroxとMicrosoftの時代に作成したかどうかはわかりませんと言いました)。大企業(Microsoft)が物事のやり方として提案したものの例としてそれを与えていました。このすべての私のポイントは、OPは、彼が働いていない会社が言う「正しい方法」である命名規則について心配するべきではないということです(彼がMicrosoftで働いていない限り、彼は気にする必要があります)。
JaCraig

[要出典]
アーロンノート

1
ええ、ハンガリーの表記法についての引用は必要ありませんでした。[要出典]は、あなたの答えの中の疑わしい主張のすべてに対するものです。
アーロンノート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.