変数の命名規則?[閉まっている]


11

ReSharper(C#用)を使い始めたばかりで、そのコードがファインダの匂いを嗅ぐようなもので、かなり前に修正するつもりだった文章(主に可変命名規則)を示しています。

メソッドとインスタンス変数の命名規則のいくつかを再考することになりました。ReSharperは、インスタンス変数はラクダの小文字で、アンダースコアで始まることを提案しています。しばらくの間、すべてのローカル変数をキャメルケースの小文字にするつもりでしたが、アンダースコアが必要ですか?快適ですか?私はこのコンベンションが好きではありませんが、私はまだそれを試していません、それについてあなたはどう思いますか?

再評価を促された2番目のことは、GUIイベントハンドラーの命名規則です。私は通常VS標準のControlName_Actionを使用し、コントロールは通常ハンガリー語表記を使用します(接尾辞として、ユーザーに見えるものと同様の名前の変数を処理する場合にないものをコードで明確にするため)。 )、それについてあなたはどう思いますか?ReSharperコンベンションに屈するべきですか、それとも他の同等に有効なオプションがありますか?

回答:


19

ReSharperを変更して、使用する命名規則スキームを使用できます。イベントハンドラー、フィールド、プロパティ、さまざまなアクセシビリティレベルなどのメソッドのカスタマイズなど、非常に柔軟です。

ツールに標準を定義させないでください-それを使用して独自の標準を実施してください。

更新: とはいえ、職場では、ほとんどのプライベートなもの(変数、フィールド、引数)については、主にラクダの小文字を使用します。メソッド名、定数、およびプロパティの大文字のキャメルケース。イベントハンドラーは、コントロール固有のものではなく、それらが表すアクションに基づいて名前が付けられます。たとえば、HandleContinueButtonClickではなくHandleCustomerContinueです。ReSharperのデフォルトスキームをしばらく試してみましたが、実際には気にしません。どちらの方法でも大して面倒ではありません。


もちろん、ローカル変数をチェックするのにどのように役立つかはとても気に入っていますが、特にイベントハンドラーに関しては、他の人々の標準について興味があります。
ジブ

かなり個人的な経験の詳細を提供するために編集しました。
mjhilton

11
「ツールに標準を定義させない」ための+1
techie007

「ツールに標準を定義させないでください」は、私のお気に入りのプログラミングの引用の1つになりました。
12

18

に関して

しかし、アンダースコアは必要ですか?快適ですか?

アンダースコアの使用に関して私が気に入っていることの1つは、「これ」の使用が劇的に減ることです。

考慮してください:

public void Invoke(int size) {
    _size = size;
}

アンダースコアなしで、あなたは書く必要があります:

public void Invoke(int size) {
    this.size = size;
}

これにより、次の微妙なエラーが発生する可能性があります。

public void Invoke(int size) {
    size = size;    // urgh ... no this! 
}

また、アンダースコアを結ぶだけでプライベートフィールドのみのリストが得られるのに対し、「this」ではすべてのリストが得られるため、コード補完はよりクリーンです。

に関して

通常、ハンガリー語表記を使用します

フレームワーク設計ガイドライン:再利用可能な.NETライブラリの規則、IDOM、およびパターンによると:

ハンガリー語表記を使用しないでください

あいまいさの余地を残さない:)


厳密に言えば、フレームワーク設計ガイドラインに従うと、パブリックメソッドに渡される変数もメソッド名に加えて大文字である必要があると記載されています:)
外科コーダー

pzycoman ...それがどこにあるのか教えてください。簡単に見てみると、パブリックメソッドに渡される変数で大文字を使用することについての参照が見つかりませんでした。しかし、たとえば、第2版のP 118には、パブリックメソッドが大文字ではなく小文字を使用している例があります。「public void Write(uint value);」
ダコタノース

10
名前の衝突の場合、私はそれthis.sizeがはるかに明確であると言うでしょう_size。下線付きの名前を使用しても微妙なエラーを防ぐことはできませんが、コンパイラーから通知されることを願っていますが、サイズをそれ自体に割り当てることができます。
edA-qa mort-ora-y

2
もちろん、いつでも自分自身に何かを割り当てることができます。主な違いthis.sizeとは_size一貫性です。this.sizeそれがオプションであることです。たとえば、という別のプライベートフィールドがある場合、コードでname使用する必要はありません。衝突this.nameするnameことなく簡単に使用できます。thisときどき使用できますが、他の時間には使用できないため、使用thisが劣っています。一方、_...とあいまいさはありません
ダコタノース

2
うーん...なぜ人々はより良​​い方法を提供する言語でアンダースコアを使用するのですか?
リグ

8

一貫性が本当に重要です。それと明確さ、すなわち、不可解であったり、すべてを省略して入力を節約しようとしないでください。インテリセンスは、あなたのタイピングセーバーであり、不可解な(しかし短い!)名前ではありません。


2
+1:コンベンションを選んでそれに固執します。何でもできます(Systems Hungarianを除く)。
ドナルドフェローズ

一貫性だけが問題ではありません。たとえば、誰かが自分のコードに一貫した命名規則を選択できますが、その規則が他の命名規則と大きく異なる場合、他のライブラリを使用するときは必然的に矛盾が生じます。たとえば、JavaでC#のプロパティの命名規則を使用することを選択した場合、他のすべてのシステムでコードがどのように記述されるかについて一貫性がなくなります。私はorder.Size()(ではなくorder.getSize())書くことができますが、他のライブラリはゲッターとセッターを使用するため、私のコードは一貫していません。
ダコタノース

明らかに、人が使用することを決めた慣習の背後にある知的な考えがあるはずですが、一貫性が最も重要なことです。
リチャード

@DakotahNorth-ハウススタイルを持つことは理にかなっていますが、それ以上に一貫性が重要な考慮事項です。慣習があまりにも簡単である限り、外部/新しい開発者が簡単に選択できます。確かに、不確実性を取り除くために、ハウススタイルを公開する価値があります。
cjmUK

7

C#では、保護された名前またはアンダースコアで始まるパブリック名は、共通言語仕様に違反しています。プライベートメンバーの場合にのみ正しいです。

MSDNから:

実装された言語に関係なく他のオブジェクトと完全に対話するには、オブジェクトは、相互運用する必要があるすべての言語に共通する機能のみを呼び出し元に公開する必要があります。このため、多くのアプリケーションに必要な基本的な言語機能のセットである共通言語仕様(CLS)が定義されています。

参照:http : //msdn.microsoft.com/en-us/library/12a7a7h3.aspx

ここでは、アンダースコアに関する警告を読むことができます。

アンダースコア(_)で始まる要素名は共通言語仕様(CLS)の一部ではないため、CLS準拠のコードはそのような名前を定義するコンポーネントを使用できません。ただし、要素名の他の位置にあるアンダースコアはCLSに準拠しています。

参照:http : //msdn.microsoft.com/en-us/library/81ed9a62.aspx

別の言語で記述されたクラスから継承できるため、保護されたメンバーは問題です。

ただし、CLSに準拠したコードが必要ない場合は、問題にならないかもしれません。


4

私はアンダースコアが好きです。一見すると、変数はクラスメンバでプライベートであることがわかります。

確かにIDEは、マウスをその上に置いたときに「一見」に勝るものがないことを伝えることができます。ローカル変数とは何か、そしてメンバー変数とは何かをあなたの目だけで知っています。スクロールやマウスホバーは必要ありません。

「this」キーワードを使用できますが、_は水平走査性を高めるために短くなります。通常、説明的な名前が望まれますが、何かが確立された慣習である場合は、1文字にする方が良いでしょう。たとえば、配列をループするときにインデックスとして文字iを使用します。iはインデックスであるという慣習が確立されているため、「i」が何を意味するのか不思議に思うことなく、スキャン可能性の利点を得ることができます。


1

私は一般的に他の人から言われていることに同意しますが、ツールやツールチェーンに関して言えば、私は怠け者で、簡単な生活のようです。人生は、彼らが示唆する方法で行う方が簡単な場合が多いと思います。その理由は

  • インストールが簡単です(デフォルトのままで、Enterキーを20回押して実行することもできます)
  • バグは通常、デフォルト設定で解決されています。多くの場合、初めて設定した難解な設定は、初めて欠陥を公開します。
  • ツールチェーンベンダーは、おそらく私よりもそれについてよく知っているので、理由があってそのようにしたのです。専門家が間違っていると判断するのは誰ですか(ツールを購入したため、専門家と見なします)
  • マネージャーがベンダーの選択を守る必要はありません-「彼らが推奨するものです」
  • 新しい男は、「なぜ」と「その方が良い」とあなたを悩ますことはありません-すべての答えが「彼らが決定したので...」

ですから、私が考えているのは、あなたが大金を費やしたばかりのツールを再構成する正当な理由を見つけることができれば、どうしてもそれができるということです。変更を正当化できない場合は、しないでください。

すべての変更には、維持するための継続的なコスト(実際のコストと隠れたコスト)があることに留意してください。少ないほど、コストは低くなります。例えば、私が言及したその新しい男-変更は彼が彼らのマニュアルを読むことができることを意味します。再構成-補遺を書き、他のものと一緒に保管し、それを廃止し、マニュアルを読んだ後に彼に読ませる必要があります。たぶん2人用の店では問題ないでしょうが、100人用の店はどうですか?


1

質問している2つのルール、プライベートフィールド名の先頭のアンダースコア、およびメソッド名は、一般にC#開発サークルの標準と見なされています。これらの規則に適応することで、他の開発者がコードをすぐに理解できるようになります。これは、他の開発者が操作に慣れているからです。

コントロールのLabel、RadioButtonなどの接尾辞も、通常は標準と見なされます。多くの場合、単一の概念(LabelやTextBoxなど)に対して複数のコントロールが存在しますが、この接尾辞は非常に便利です。真のハンガリーの表記法は、元の意図を表さないものに卑劣化されたためにずっと前に放棄されました。


1

私の場合、キャメルケースとアンダースコアを使用すると、説明的な(読み取り:長い)変数名とコード補完に役立ちます。Visual Studioのオートコンプリートがどのように機能するかはよくわかりませんが、QtCreatorでは、Eclipseでは、たとえば次のように入力できます。

sDI

そしてそれを展開しました

someDescriptiveIdentifier

あなたが次のような名前を持っている場合の入力を少し節約します

someDescriptiveName, someOtherDescriptiveName, someOtherButNotTheSameDescriptiveName

「記述的な命名モード」のときに生成する傾向があります。

アンダースコアを使用して、オートコンプリートする名前を決定できます

someDescriptiveIdentifier

または

_someDescriptiveClassMember

私の説明が十分に明確であることを願っています:)

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