Java変数とメソッド名でアンダースコアを使用する[クローズ]


83

今日でも、Java変数とメソッドにアンダースコアがよく見られます。例としては、メンバー変数( "m_count"や "_count"など)があります。私が覚えている限り、これらの場合にアンダースコアを使用することは、Sunによって悪いスタイルと呼ばれています。

定数はすべて大文字であり、キャメルケースではないため、使用する必要があるのは定数のみです( "public final static int IS_OKAY = 1;"など)。ここで、アンダースコアはコードを読みやすくする必要があります。

Javaでアンダースコアを使用するのは悪いスタイルだと思いますか?もしそうなら(またはそうではない)、なぜですか?

回答:


146

現在使用しているコードがない場合は、続行することをお勧めします。コードベースがそれを使用している場合は、それを続けます。

コーディングスタイルの最大の特徴は一貫性です。一貫性のあるものが何もない場合は、言語ベンダーの推奨事項から始めるのがよいでしょう。


3
アンダースコアを使用せずにコーディング規約を使用します。とにかく、フレームワークと古いコードを見ると、アンダースコアがよく見られました。一貫性が慣習を支配するという質問は、一貫性のために明確に答えられるべきですが、質問をしているときに私が考えた点ではありません。
ゲオルギ

1
'_'文字を継続して使用することは悪い習慣です。この作業方法では、追加のメンテナンスコストが発生し、チームに参加する新しい開発者ごとにこれらの例外的な規則を通知する必要があります。
ハリル2017年

1
これは、次のようにインターフェイスに名前を付けるようなものです。-ReadableInterface完全に冗長。最新のIDEでは、変数のタイプやその範囲を指定する必要はありません。色付けとクイックジャンプですべての作業を実行できます。したがって、IMOは、冗長な文字を入力し、人々にそれを読んだり維持したりするように強制するため、悪いスタイルです。
kiedysktos 2017年

120
sunDoesNotRecommendUnderscoresBecauseJavaVariableAndFunctionNamesTendToBeLongEnoughAsItIs();

as_others_have_said_consistency_is_the_important_thing_here_so_chose_whatever_you_think_is_more_読み取り可能();

一貫性が慣習を支配するという質問は、一貫性のために明確に答えられるべきですが、質問をしているときに私が考えた点ではありません。とにかく、古い痕跡を残すべき時がありますね?
georgi

2
「矛盾する」命名規則がすでに使用されている場合、それは私たちが話しているコードの量に依存すると思います。古い規則が一貫して使用されていることを考えると、old_conventionからnewConventionに移行するためだけに数千行のコードを書き直すことはお勧めしません。
Anders Sandvig 2008

笑!とはいえ、スペルチェックのあるエディターにコードを貼り付けると、「スペルミス」の単語に下線が引かれ、アンダースコアが不明瞭になります。これは、アンダースコアを使用しない理由です。また、キャメルケースは短くなっています。最後に、Shiftキーは、上の行よりも文字で使用する方が簡単です(つまり、Shiftダッシュ '-')。
ティハマー

@Tihamer他の人は、snake_caseフォームが読みやすいと主張するでしょう。特に短い単語(1〜2文字)の場合は、間違いなくそうだと思います。「入力しにくい」については、lotsOfMixedCaseWithinItで単語を入力するのも必ずしも便利ではありません。私はそれがあなたが慣れているものの問題であることを主張したいと思います。ただし、Javaでは、JLSなどで推奨されている「共通の形式を使用する」と言います。Ruby / Python / Cでは、スネークケースを使用します。以下のように...
パーLundbergの

37

ルール:

  1. 編集しているコードが行うことを実行します
  2. #1が当てはまらない場合は、アンダースコアなしでキャメルケースを使用してください

31

_またはm_を使用してメンバー変数を示すことは、Javaやその他の言語では悪いことではないと思います。スニペットを見て、ローカルからすべてのメンバー変数をすばやく特定できるため、コードの可読性が向上すると思います。

これは、ユーザーにインスタンス変数の前に「this」を付けるように強制することでも実現できますが、これはやや厳格です。多くの点で、インスタンス変数であるためDRYに違反します。なぜ、2回修飾するのですか。

私自身の個人的なスタイルは、_の代わりにm_を使用することです。その理由は、グローバル変数と静的変数もあるからです。m _ / _の利点は、変数スコープを区別できることです。したがって、_をグローバルまたは静的に再利用することはできません。代わりに、それぞれg_とs_を選択します。


1
この質問は、Javaアンダースコア全般について質問することであり、メンバー変数でのみ質問することではありません(これは質問の例でしたが)。
ゲオルギ

10
それで、あなたは質問のサブセットにコメントするために私をマークダウンしますか?少し極端なようです
JaredPar 2008

1
@ JaredPar-良い代替スタイリングの提案をするのはあなただけです。そのための+1。
djangofan 2013

this.foo(またはC ++ではthis-> foo)を記述することは、ローカル変数とフィールド/メンバー変数を区別するためのはるかに明確な方法になるでしょう。
ケビン

7

「悪いスタイル」は非常に主観的です。特定の慣習があなたとあなたのチームにとってうまくいくなら、それは悪い/良いスタイルを修飾すると思います。

あなたの質問に答えるには:私は先頭の下線を使用してプライベート変数をマークします。私はそれが明確であり、コードをすばやくスキャンして何が起こっているのかを知ることができます。

(ただし、名前の衝突を防ぐためを除いて、「これ」を使用することはほとんどありません。)


あなたが言ったように、スタイルは非常に主観的です。私thisは、メンバー変数に注意を向ける必要があると思う場合、メンバー変数を示すためにかなり自由に使用する傾向があります。しかし、私はそれについて熱心ではありません。
Chris Cudmore

6

変数の前に「m_」または「_」を使用すると、オブジェクト全体のメソッドでメンバー変数を簡単に見つけることができます。

副次的な利点として、「m_」または「_」と入力すると、intellsenseが最初にそれらをポップアップします;)


5
Javaをプログラミングしている場合は、メンバー変数を別の色で色付けするIDEを使用している可能性があります。「m_」はただ厄介です。
JeeBee 2008

よく読めるので「その」が好きです:if (itsEmail.equals(email))
davetron5000 2008

7
私はこれが好きです。メンバー名の場合。絶対に紛れもない。
S.Lott 2008

5
  • 私はたまたま(プライベート)インスタンス変数の先頭の下線が好きで、読みやすく区別しやすいようです。もちろん、これはエッジケース(たとえば、パブリックインスタンス変数(一般的ではない、私は知っています)-どちらの名前でも問題になる可能性がありますそれらは間違いなくあなたの命名規則を破っています:
  • private int _my_int; public int myInt;? _my_int? )

-私はこれの_styleが好きで、読みやすいと思いますが、それは珍しく、使用しているコードベースの他のものと一致しない可能性が高いため、価値があるよりも間違いなく厄介だと思います。

-自動化されたコード生成(例:Eclipseの生成ゲッター、セッター)はこれを理解できない可能性が高いため、手動で修正するか、Eclipseで認識できるようにマックする必要があります。

最終的に、あなたは(java)の世界の残りの設定に反対し、そこからいくつかの迷惑をかける可能性があります。そして、以前の投稿者が述べたように、コードベースの一貫性は上記のすべての問題よりも優先されます。


3
プレフィックス(またはサフィックス)の設定を理解するようにEclipseを設定するのは非常に簡単です。「設定」->「Java」->「コードスタイル」には、フィールド、静的フィールド、静的最終フィールド、パラメーター、およびローカル変数の変数名の規則を設定できるテーブルがあります。すべてのコードジェネレーターは、これらの設定を尊重しているように見えます。
metasim 2012

5

昔はアンダースコアを使うのは悪いスタイルだと考えられていたのには理由があります。ランタイムコンパイラが手ごろな価格で、モニターが驚異的な320x240ピクセルの解像度で提供されていたとき_name、とを区別するのは簡単ではありませんでした__name


これが、OCamlが古いマシンで実行されない理由です。
David Tonhofer 2017

4

プライベート変数とパブリック変数を区別するものがあると便利ですが、一般的なコーディングでは「_」は好きではありません。私が新しいコードでそれを助けることができれば、私はそれらの使用を避けます。


4

これは、Javaに関するSunの推奨事項へのリンクです。これらを使用する必要があるわけではなく、ライブラリコードがすべてに従う必要があるわけでもありませんが、最初から始める場合は良いスタートです。Eclipseのようなツールには、これらの規則(または定義した他の規則)に準拠するのに役立つフォーマッターとクリーンアップツールが組み込まれています。

私にとって、「_」は入力するのが難しすぎます:)


3

それはコーディングスタイルのブレンドです。考え方の1つは、プライベートメンバーの前にアンダースコアを付けて区別することです。

setBar( int bar)
{
   _bar = bar;
}

の代わりに

setBar( int bar)
{
   this.bar = bar;
}

他の人は、アンダースコアを使用して、メソッド呼び出しの最後にスコープ外になる一時ローカル変数を示します。(これはかなり役に立たないと思います-良い方法はそれほど長くはないはずです、そして宣​​言はそこにあります!だから私はそれが範囲外になることを知っています)編集:神はこの学校のプログラマーとmemberData学校のプログラマーが協力することを禁じています!!それは地獄でしょう。

生成されたコードの前に_または__が付く場合があります。人間がこれを行うことは決してないという考えなので、安全です。


あなたの場合、私は以下を使用します:setBar(int aBar){bar = aBar; これなしで読み取り可能。または_bar ...
Georgi

それは十分に公平ですが、APIのメソッドシグネチャにaBarが表示され、乱雑に見えると思います。
Chris Cudmore

1
実際に、自動生成されたコードが言語キーワードの1つと一致する場合に遭遇したため、これを回避する最善の方法は、先頭に_を付加することでした。
Joe Plante 2013年

2

言語独自のスタイルガイドラインに違反するスタイルは(正当な理由なしに)醜く、したがって「悪い」と思います。

あなたが見たコードは、アンダースコアが受け入れられる言語で働いていた誰かによって書かれたことは間違いありません。

新しいコーディングスタイルに適応できない人もいます...


私はコーディングの際に「他の人と同じように行う」という哲学にほぼ同意しますが、絶対的なものではありません。妥当な識別子の長さを考えると、snake_cased_variablesはCamelCasedVariablesよりも読みやすいという非常に強い議論があると思います。私の正当化は、認知的負荷を視覚的に減らすことは小さなことですが、それでも有用であるということです。人々は、ドキュメントを読んだり、音楽を聴いたりするときに、コードの空白を高く評価しています。キャメルケースは、「効率」という名目で空白を侮辱していると思います。誰のための効率?
David J.

2

(私の経験では)人々がそれを行う理由は、メンバー変数と関数パラメーターを区別するためです。Javaでは、次のようなクラスを持つことができます。

public class TestClass {
  int var1;

  public void func1(int var1) {
     System.out.println("Which one is it?: " + var1);
  }
}

メンバー変数を_var1またはm_var1にした場合、関数にあいまいさはありません。

だからそれスタイルであり、私はそれを悪いとは言いません。


このシナリオでは、通常、パラメーターの名前を「aVar1」に変更します。「var1」とは対照的です。
Lluis Martinez

1

個人的には、言語はコーディングスタイルに関するルールを作るべきではないと思います。それは、好み、使用法、利便性、読みやすさに関する概念の問題です。
ここで、プロジェクト、リスト間で一貫性を保つために、コーディングルールを設定する必要があります。これらのルールに同意できないかもしれませんが、貢献したい(またはチームで作業したい)場合は、これらのルールに従う必要があります。

少なくとも、EclispeのようなIDEは不可知論者であり、可変の接頭辞や接尾辞、さまざまなスタイルのブレースの配置やスペース管理などのルールを設定できます。したがって、これを使用しガイドラインに沿っコードを再フォーマットできます

注:私はC / C ++の古い習慣を守り、Javaをメンバー変数のm_プレフィックス(静的変数の場合はs_)でコーディングし、ブール値の前にイニシャルbを付け、関数名に最初の大文字を使用し、中括弧を揃えています。 .. Javaファンダメンタリストにとっての恐怖!;-)
おかしなことに、それは私が働いている場所で使用されている規則です...おそらく主な初期開発者はMFCの世界から来ているからです!:-D


0

それはあなた自身のスタイルであり、悪いスタイルのコードでも、良いスタイルのコードでもありません。私たちのコードを他のコードと区別するだけです。

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