1文字の変数の使用が推奨されていますか?[閉まっている]


13

Javaでは1文字の変数の使用が推奨されていますか?コードスニペットまたはチュートリアルでは、よく見かけます。コードを読むのが比較的難しくなり、他のプログラミング言語で使用されているのを見たことがないので、それらの使用が推奨されるとは想像できません!


3
はいといいえ。完全に状況に依存します。
ザビエル




1
常にコードを読みにくくするわけではありません。たとえば、数学の方程式に基づいてコードを実装する場合、通常は方程式で使用されるものと同じ変数名を使用するのが理にかなっています。(コメントは、元の方程式が見つかる紙/テキストを指し示します。または、あなたが私のようであれば、LaTeXコードを含めることもあります。)
jamesqf

回答:


32

物事を適切に命名するのは難しい。とても厳しい。逆に見れば、適切に名前が付けられたものが重要であることを意味するものと考えることもできます。(そうでなければ、なぜあなたはそれを命名する努力を費やしたでしょうか?)

しかし、場合によっては、物の名前は重要ではありません。それが、たとえば、匿名関数(「ラムダ」)のようなものがある理由です。たとえば、名前を付けるだけの価値がない場合があるからです。

単一文字(または非常に短い)の変数名が適切な例が多数あります。

  • ijklループインデックスの
  • kおよびvマップのキーと値
  • n数(例えば中Math.abs(n)
  • abc任意のオブジェクト(例えば中max(a, b)
  • e汎用for eachループ内の要素
  • f 高階関数の関数
  • p フィルター内の述語関数用
  • TT1T2、...型変数について
  • E コレクションの要素タイプを表すタイプ変数用
  • R 関数の結果の型を表す型変数の場合
  • excatch節の例外について
  • op マップまたはフォールドでの操作用
  • s複数を示すために文字を追加します。つまり、コレクション(たとえばns、数字のコレクションxsys、2つの任意のジェネリックオブジェクトのコレクション)

他のプログラミング言語で使用されているのを見たことはありません!

Haskell、F#、ML、Ruby、Python、Perl、PHP、C#、Java、Scala、Groovy、Boo、Nemerle、 D、Go、C ++、C、名前を付けます。


5
-1 1文字の変数名を使用するのは遅延プログラミングです。時にはそれが怠惰にしても大丈夫ですが、あなたは、最大取得している場合kl遠すぎだループインデックス、に(あなたが開始する多くのネストされたループを持つべきではありません。機能に抽出して)。個人的に、私は複数の関数ごとに1文字の変数が、0のIシュート使用することはありません
ダニーPflughoeft - BlueRaja

また、lまたはlen長さのために、使用されているarr(例えば:配列ためfor(var i=0; l=arr.length; i<l; i++))。また、関数を参照するときfnf、の代わりに使用される場合があります。
イスマエルミゲル

4
@ BlueRaja-DannyPflughoeft私はそれを効率的なプログラミングと考えることを好みます。Jorgは、どこかだけでなく、1文字が適切な場合に拡張できる可能性がありますが、正直なところ、ほとんどのプログラマーは線を引きます ループインデックスについては、インデックスがセマンティック値を持つ名前を必要としないコードは、不必要な抽出に対するマルチレベルのネストを正当化するのに十分単純であると主張できます。また、ネルソンが提起する可能性のあるスコーピングの問題を避けるために、別々のループで使用することもできます。
リリエンタール

2
@Lilienthal:コードは、書き込みが効率的ではなく、読み取りが効率的でなければなりません。通常、これらは同じものですが、この場合のように常にではありません。
BlueRaja-ダニーPflughoeft

@ BlueRaja-DannyPflughoeftすべてのプログラムでそうではありませんが、Jorgの提案には何の問題もありません。キリアンはそれを置く:「長いものは、おそらく意味論任意のより多くの明白なことを行いますが、読み取ることがはるかに長くかかることはできません。」しかし、これはおそらく個人的な好みとスタイルの問題でしょう。
リリエンタール

20

ループがカウントに変数を使用するだけの場合

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

はい、これはあなたが使用できる最高の名前です。これ以上セマンティクスを明確にすることはできませんが、読むのにかなり時間がかかります。

変数が内部で使用されている場合ループ意味のある名前が役立つ場合があります。

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

変数がメソッド全体で使用される場合、その名前はより長くする必要があります。クラス全体で使用される場合、その名前は完全に自明である方が良いでしょう。そうでない場合、ほぼ確実にコードの明瞭さが低下します。

つまり、変数のスコープが大きいほど、その名前は長くなければなりません。


正直なところ、1文字の変数名であるピリオドを使用しないようになりました。私は、カウンターであっても、使い方を詳しく説明する名前を使用しようとします。indexたとえば、通常、配列を反復処理するときに名前が付けられた変数を使用します。
マイケル

13
@Michael:私の意見では、Programming Jargonは独自の言語であり、英語ではありません。そしてその言語でiは、正確に定義された意味を持つ適切な単語、つまり「あまり心配する必要のないインデックス」です。しかし、それは親しみの問題だと思います。あなたはHaskellのをたくさん読んでいる場合は、読み取りに慣れますmようモナドfとしてファンクタxなどいくつかのオブジェクトxsなどのリストxSのように。
ヨルグWミッター

2
本当に大きな警告です。言語に適切な変数スコープがある場合にのみ、1文字の変数名で問題ありません。あなたは明らかに「適切なスコープを持っていない言語は何ですか?」さて、JavaScriptがFORループの変数をスコープしないことを知るのに3時間かかりました。同じ変数名を使用してforループ内のforループで試してください。それはあなたの心を吹き飛ばします。
ネルソン

@Nelson:この質問とこの答えは、Javaに関するものです。明らかに、言語が異なれば考慮事項も多少異なります。(JavaScriptはJavaと同じ言語ではありません。)
ruakh

私はすべて、1文字の変数名が最も理にかなっている場合はいつでもi使用しますが、カウントにのみ変数を使用するループに「使用できる最適な名前」であることに同意しません。その場合、私はむしろcount変数名として使用されるのを見たいです:即座に理解可能。for (int count = 0; count < 10; count++)またはwhile (count--)
トッドリーマン

4

Kilianの答えのコードを読んで、「ループがあり、変数があり、型がintで、名前があり、名前がiで、0に初期化されている」とは思わない。 ..」。「ループ...」と思うのは、3つの点が、私が考えていない重要でない詳細を表しているからです。私のプログラマーの心の中では、その変数は実際には存在せず、ループにするfor(;;){}のように、入力しなければならないアーティファクトです。

その変数は私の心の中にも存在しないので、どうして絶対に必要なものを超えて名前を付けるのでしょうか?


私は、構文のようなもので、私は頻繁にいなくても使用するように誘惑だということを付け加えなければならないiが、_明らかに無意味な変数のために。しかし、誰もがPrologに精通しているわけではなく、おそらく削除するよりも注目を集めるでしょう。
キリアンフォス

また、ヘッダー内だけでなく、ループ内で変数がどのように使用されるかを考慮する必要がありますfor (...)

@KilianFoth:Haskell、ML、F#、Scalaでも同じように使用されていると思います。そして、Rubyでは、_他のものと同様に正当な識別子であるにもかかわらず、Rubyが通常それらについて警告しているにもかかわらず、名前が付けられた_(またはで始まる_)未使用のローカル変数は「未使用のローカル変数」警告を生成しないという最近の変更がありました。
ヨルグWミットタグ

-1

ループ内のインデックスとして文字i、j、kを参照している場合、これはJavaおよびその他のプログラミング言語で一般的な方法です。ただし、次のようにfor eachスタイルループを使用する方がおそらく良いでしょう。

for(User user: users) {
  doSomethingWithTheUser(user);
}

の代わりに

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Javaでは、このスタイルのループはごく最近導入されました。配列またはリストをループするための最も一般的な方法は、以前はインデックスのループであったため、Javaの方がより多くのことに気付いている理由かもしれません。

n、x、yなどの単一の文字がすでに一般的な数学関数を実装する場合など、単一の文字が適切な場合がいくつかあります。しかし、一般的にいや、変数に意味のある名前を付けてください。


5
「Javaでは、このスタイルのループはごく最近導入された」... 10年前のように?(Java 5は2004年にリリースされました
メリトン

1
はい、それはかなり最近です。いいえ、私は年配ではありません。黙れ。くそーの子供たちは私の芝生を降ります。以前のJava 5にはまだ多くのレガシーJavaアプリケーションがあります。さらに、Java 1.4で言語を学習し、その方法を更新することを拒否したJavaプログラマーはさらに増えています。さらに、2000年代初頭にさかのぼる、さらに多くのコードサンプルがオンラインにあります(はい、当時インターネットがありました。Web2.0と呼びました)。
ニック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.