短い識別子は悪いですか?[閉まっている]


26

短い識別子は悪いですか?識別子の長さとコードの理解はどのように相関しますか?識別子の命名に関しては、他にどのような要因(コードの理解以外)を考慮する必要がありますか?

回答の質を維持するために、このテーマに関する調査が既に行われていることに注意してください!

編集

私が提供した両方のリンクが大きな識別子が有害であることを示しているとき、誰もが長さが関連しているとは思わないか、より大きな識別子を好む傾向があることに興味があります!

リンク切れ

以下のリンクはこのテーマに関する研究を指していましたが、今は壊れています。私は論文のコピーを持っていないようで、それが何であったかを思い出しません。他の誰かがそれを理解できるように、ここに残しておきます。


5
データポイント。私のお気に入りの短い識別子は:、のように、:(){ :;:& };:ほとんどの人がかなり悪いと思うと思います。;)

@fennec:フォーク爆弾はそうである傾向があります。
ジョシュK

このstackoverflowの質問をチェックしてください。すべてのプログラマーが読むべき本のプログラミングの実践についてのコメントがあります。
slu

1
長い名前を避ける必要があるからといって、短い名前のためにそれらを短くするために余分な努力をする必要があるという意味ではありません。
-JeffO

1
@cessorおもしろいことは、研究に関するものが意見に基づいて閉じられたことです。悲しいことに、受け取った答えを考えると、私は同意します。
ダニエルC.ソブラル

回答:


67

私が聞いた最高の「ルール」は、名前の長さは変数のスコープの長さに比例する必要があるということです。そのためi、ループの本文が数行の長さであればインデックスは問題ありませんが、15行より長くなる場合は、もう少し説明的なものを使用したいと思います。


6
私はそのようなことを聞​​いたことがなく、この原則がコードの可読性を改善するとは思わない。
NimChimpsky

8
@Nim:同意します。短いforループであっても、インデックスなどに名前を付けcustomerCounterます。追加の労力が最小限で済み、コードが大幅に改善されます。短いスコープに短い変数を使用することは、怠toな言い訳のように聞こえます。
誰も

2
うーん、それは私にとってのルールやガイドラインではなく、長さについて考えさせる方法であり、その文脈ではある程度意味があります。私は確かにそれが怠exの言い訳になるとは思いません(一部の人はそれをそのように取るかもしれないことに同意しますが)。私の識別子は、多くの場合よりも長いです(早い段階でパスカルを教えられている兆候)、1、2、または3文字の識別子(通常はタイプの頭文字)が私にとって理にかなっているように見えるlinqクエリやラムダ式のようなものに着いたときを除いて。
マーフ

33
+1正直なところ、「説明的な」名前は、5行のforループのノイズです。ほとんどの人は、あなたが「i」で何をしているのかをかなりよく理解していると思います。ネストされたループで説明的な名前を使用しましたが、それらのスコープは長くなります。
ジェレミー

18
+1- ijは、すべての開発者がIMOを理解できる一般的な名前です。
TheCloudlessSky

48

各変数には意味があり、その名前はその意味の一部です。そして、非常に重要な部分です。なぜなら、読者がアルゴリズムを深く掘り下げることなく、その目的を理解するのに役立つからです。ijインデックスとして使用されることは明らかで、短いですが非常に有益です。bntい、closeまたはcloseButton意味があります。そのため、変数名の長短は最も重要な基準ではなく、意味のあるものでなければなりません。意味は、コンテキストに強く依存します。たとえば、n10文字というコードの小さなブロックで使用され、プロパティの名前を参照するローカル文字列変数のような非常に短い名前を付けることができます(v値は別の例です)。

そのため、変数名は有益である必要があり、変数名は短くても長くてもかまいません


2
+1、そして注意してください、closeとcloseButtonも同義ではありません。Closeは動詞であるため、関数またはメソッドの名前にする必要があります。一方、closeButtonは名詞であり、明らかに、close関数をトリガーするボタンの名前にする必要があります。
CaffGeek

closeは形容詞close = trueです。例:;)
Armand

13

長さに関係なく、変数を記述する識別子を使用します。

i、j、およびkのケースは、それ自体が偏在するため、自己記述的であり、ループインデックスであることが自動的にわかります。以下についても同じことが言えます:

foreach loop (Strings s : myString)

ただし、IDEにはコード補完ツールが用意されているため、非常に長くて説明的な識別子のマイナスの副作用のみが削除されています。

変数の目的を説明する必要がある場合は、識別子に追加の単語を追加します。


3
ところで、ループインデックスにi、j、kを使用すると、50年以上前にFORTRANに戻ります。IからNまでの文字で始まる変数は、デフォルトではINTEGERタイプです。他の文字で始まる変数は、デフォルトではREALです。これは当然、forループインデックスにI、J、Kを使用することになりました。(FORTRANの規則は、おそらくそれ以前の数学の方程式で使用されていたこれらの変数の使用から生じたものです。)
tcrosley

2
私がリンクした2番目の論文は、非常に長い説明的な識別子はコードを理解する能力を低下させ、「負の副作用のみ」の発言と矛盾することを示しました。
ダニエルC.ソブラル

3
非常に長い識別子の本当のマイナスの副作用は、読みやすさです。2つの非常に長い識別子が同じか異なるかを一目で判断することは困難です。また、非常に長い識別子を持つ式のすべての要素を抽出することは困難です。
デビッドソーンリー

tcrosley-Fortranから来たからといって、そのような慣行を続ける理由はない、と付け加えます。「i」、「j」、「k」などと呼ばれるイテレータ/ループカウンタの使用は強くお勧めしません。これは単純な知的怠lazです。ユビキタス<>良い。
すぐに

9

誤解を招く識別子ほど悪くはありません。識別子が1文字だけであるコードのデバッグは気にしませんが、異なる命名規則が登場するとすぐに迷惑になります。例えば、どこかで見たらstrPersonID、次にどこかで表示s_EmployeeIDされる場合、これらの両方の文字列であるかどうかと、違いがあるかどうかを判断するのは混乱します。また、変数がコピー&ペースト(pmapIntString = new std::map<int,int>)されていて完全に間違っている場合も心配です。

私の場合は、使用する重要な変数のコードにコメントを追加し、開発ガイドラインに記載されている標準を維持しようとします。標準がない場合、コード全体で同じ命名規則を維持しようとします。


5

私は苦闘する...

私は常に識別子として説明的な名前を使用しますが、最近では非常に短い識別子を使用しています。

コードのコンテキストに依存すると思います。

  • 複雑な関数(アルゴリズム)を記述する場合は、常に短い識別子を使用します(単一文字が最適です)
  • 関数のパラメーター値を記述するときは、説明的な名前を使用します。

コードの密度にも依存すると思います。実際に名前があると、実際には読みにくくなります。

時には名前なしで完全に不可解です!


1
ただし、複雑なアルゴリズムを作成している場合、コードを初めて見る人にとって識別子をよりわかりやすくしたいとは思わないでしょうか?
Maxpm

単一文字の識別子はいつまで適切ですか?
アミールアフガニ

1
私もそれを考えるのに使用しますが、実際にはこれは事実ではないことがわかったので、自分で試してみてください。複雑なアルゴリズムを使用して、わかりやすい名前と1文字の変数を試してください。
ダークナイト

1
私は同意しますが、長い複雑な数式については、それらが長くなりすぎる傾向があり、その場合でも関数(関数名)を使用してその数式の一部を記述することができます。
エミールVrijdags

1
それは複雑だし、パターンを持っている場合は、それらのパターンは、関数の中に出て分割する必要があります
CaffGeek

3

私の考えでは、それらはそれ自体悪いものではありませんが、非常に標準的でない限り有益ではありません。

ループ変数はi、jkですは非常に標準的であるため、インデックス付きループを作成する場合に使用しない理由はありません。

非常に短い識別子を使用するもう1つの場所は、foreachループからの一時変数など、数行後にスコープから外れる一時変数を宣言するときです。他の場所で参照されない場合、コードを読んでいる人は誰でも簡単に宣言を見て、それが使用されているものに従うことができます。ただし、5行または6行以上使用する場合は、より明確な名前を付けたいと思います。

特にクラスレベルでは、有益な長さの識別子を使用しようとしていますが、変数の目的を読んで理解できる識別子が必要です。それらが長くなりすぎている場合(そして、識別子のために4つまたは5つの単語がつながれているコードを時々見ます)、私はそれをコードの匂いと見なす傾向があります-私の変数を区別するために多くのテキストが必要な場合、実際にはそれらはグループですハッシュマップまたはリストに保存する方が良いでしょうか?このデータをより正確にモデル化するために、何らかのオブジェクトを作成できますか?できない場合もありますが、非常に長い識別子は、ここで注目に値するものがあることを示しています。


3

ここでの他の回答には非常に同意しますが、見落とされがちな他の要因を指摘したいと思います。良い名前は、多くの場合、コードに対して慣用的な名前です。これは、言語レベル、アルゴリズムレベル、または手元のコードベースのいくつかの内部イディオムになります。ポイントは、名前はコードのドメインを知らない人にとっては何の意味も持たないかもしれないが、与えられたコンテキストでは依然として最良の名前かもしれないということです。


3

変数に名前を付けることは、常に一意性と包括性のバランスをとる練習です。名前の長さは、さまざまな方法で両方に関連しています。名前が長いほど一意になりやすくなります。中程度の長さの名前は、短すぎるまたは長すぎる名前よりもわかりやすい傾向があります。

非常に短い変数名は、それが理解なる履歴(例えば、ある場合にのみ有用であるij、およびk、インデックスのdxまたはすべての参照は、例えば、(一度に見えるようにするために十分に小さいであるスコープ軸に沿った距離のための)を、temp)。世界で最悪の変数名はのようなものですt47。(「それはどういう意味で、なぜそれと違うのt46ですか?」)命名のスタイルが主にFORTRANで出てきたのは良いことですが、これがより長い変数名への欲求が根づいているところです。

あなたの元の論文が示したように、コードをちらっと見ると微妙な内部の違いを見逃す可能性があるため、長すぎる名前も読みにくいです。(DistanceBetweenXAxisAbscissae&の違いをDistanceBetweenYAxisAbscissaeすぐに理解するのは本当に難しいです。)

NoteToSelfが以前に指摘したように、名前の一意性の要件は、主に名前が一意でなければならないスコープに依存します。5行のループのインデックスはi; 関数から関数に渡されるアクティブなレコードのインデックスには、よりわかりやすい名前を付けた方が良いでしょう。

関数のローカル変数には、deltaX問題のないようなわかりやすい名前を付けることができます。モジュール内の静的なデルタX変数には、このdeltaXと同じモジュール内の他のdeltaXを区別する名前を付けて、長くする必要があります。そして、おそらくモジュール名を他の記述名に連結することによって、グローバルなデルタX変数を、すべてのモジュールおよび作成される可能性のある他のすべてのモジュールにわたって一意にする必要があります。これは、グローバルに関する多くの問題の1つです。便利に一意にするために、名前は読みにくくするのに十分な長さでなければなりません。


2

それどころか、長い識別子は短い識別子よりも悪いと思います(定数を扱っていない限り)。を使用TheVariableThatHoldsTheCapacityOfMyContainerClassすると、コードを使用するよりもエラーが発生しやすくなりますCapacity


1
同じ理由ではないにしても、私がリンクした研究の1つがあなたの推論をサポートしていることを知って喜んでいるでしょう。;-)
ダニエルC.ソブラル

1
また、非常に長い識別子を読み間違えやすく、混乱させるか、2つの識別子が同じであることに気付かない可能性もあります。
デビッドソーンリー

2
TheVariableThatHoldsTheCapacityOfMyContainerClassは、私が「長い」と見なすよりも大きいです-10語は、CamelCaseが助けるには長すぎます。読みやすくするにはスペースが必要です。
リチャードガズデン

1
確かに、これはストローマンです。長い名前の例では、冗長性は追加されますが、情報は追加されません。さまざまな形式の容量に関連する複数の変数がある場合を考えます。次に、initalCapacityやfinalCapacityなど、目的を区別する名前が必要になる場合があります。
チャールズE.グラント

2
@Maxpm、var total = Capacity + Capacity2; 何がCapacity含まれ、何がCapacity2含まれますか?それらは何のために使用されますか?コンテキストの手がかりを探すことは時間の無駄です。一方、var totalStorageCapacity = truckCapacity + trailerCapacity;私たちが話していることを知っているように書かれている場合。
CaffGeek

2

で、それ自体、短い識別子は悪くありません。適切な名前(短いまたは長い)を選択する目的は、コードを明確にするためです。 コードを明確にするサービスで識別子を選択することは、最小長の要件を満たすよりも重要です。 一般に、これが意味することは、少し長い意味のある名前を書くことです。


+1あなたは非常によくそれを言った、私は答えを書いたときに私の言葉を見つけることができなかった:-)
ComputerSaysNo

1

私が長年にわたって経験してきたことは、10年前または15年前よりも今日はそれほどではありません。入力できないプログラマーは、変数の命名法をめぐってあなたと格闘するプログラマーです。これらは、すべて1〜3文字の変数名を持つものです。

そのため、多くのコメンターが言ったように意味のある名前を使用し、入力することを学びます。私は、人々がどこにいるかを見るために、インタビューにタイピングテストを追加することを検討してきましたが、コンピューターが社会の大きな部分を占めるようになるにつれて、タイピングを行っていない人の数が減ってきています。


2
実際、そのような相関関係は見ていません。どちらかと言えば、OO言語の人々は長い識別子を使い、関数型言語の人々は短い識別子を使います。OOがモデリングに役立つという主張に疑問を投げかけています。:-)
ダニエルC.ソブラル

名前は入力するだけでなく読む必要があることを忘れないでください。長すぎる識別子を使用すると、実際に可読性が大幅に低下する場合があります。iループ内のようなもの以外を使用することはfor (int i=0; i<dst.size(); ++i) dst[i] += src[i]法律で禁止されています。
-maaartinus

1

リンクする最初の論文は興味深いように見えますが、その結論は、意味のある変数名を含む「グラウンディングヒント」がコード理解に役立つという仮説の重要な証拠を見つけられなかったということです。使用された注視滞留時間は、コード理解のプロキシとして興味深いものですが、スラムダンクではありません。

私は2番目の論文がばかげていると思った。最初の問題は、それらが提供する長い名前の例が無用に長く、余分な情報を提供しないことです。変数名を長くするだけで変数名を長くするのは馬鹿げていることに全員が同意できると思います。dxではなく変数distance_between_abscissaeを命名する彼らの例は、ストローマンです。

さらに重要なことに、彼らの実験は理解ではなく単純な暗記のテストです。コンテキストなしのリストで提示された場合、変数名の欠落部分を埋める被験者の能力をテストします。はい、長い名前は記憶するのが難しいですが、コーディングするときは変数名を記憶せず、コンテキストを提供するためにそれらを使用します。長い変数を覚えるのが難しいとコードを書くのが難しくなるが、コードは書かれているよりもはるかに頻繁に読み取られるので、どのアクティビティを最適化する必要があるのでしょうか?


2番目の論文では、「8つの質問で使用されている8つの名前は、実動コードから抽出された」と明記されていることに注意してくださいまた、彼らは暗記だけではなく、正確さについてもテストします。
ダニエルC.ソブラル

1

コードの行が読み取り可能かどうかを判断するための主な指標の1つは、その行が何をしているのかを確実に理解するために、他の行からの他のコンテキストをどれだけ読み取る必要があるかです。

「i、j、kがループ変数であることは誰でも理解できるはずです」と言うのは簡単です。そしてほとんどの場合、それは本当に明らかです。しかし、私はまだこの点について謙虚でプロフェッショナルになり、プログラミング時に間違いを犯しやすいと考えています。したがって、Grobbleの配列をループ処理する場合、ループ変数にgrobbleIndexという名前を付けます。インデックスの略語としてiを受け入れることもできます。ijとkを使用している場合、間違った配列で間違ったインデックスを使用するなどのエラーを見つけるのは難しくなります。そして、内部ループがあるとさらに悪化します。

PS。この回答を書いたとき、vimで垂直に分割された画面を持つ10インチのミニラップトップでJavaScriptをコーディングしていましたが、ループ変数にrowIndexとcolumnIndexという名前を付けるのに時間がかかりました。


0

一部のアプリケーションでは、短い変数では変数内のデータを説明できません。短いか長いかは関係ありません。長い変数を使用しても、コードが遅くなることはありません。確かに長い変数名を入力するのはもっと手間がかかりますが、少なくとも6か月後にコードを読んだ人(あなたかもしれません)は、それが可能であると仮定してトレースを置く必要なく、何が起こっているかを知ることができます。


0

私は、理想的には名前が説明的でなければならないことだと思うしない限り ...

名前が短くなる可能性があります(そうするべきである)という考え(したがって、暗示的な説明が少ない)は、名前の範囲が制限されている場合、理想から逸脱する理由の1つにすぎません。

個人的には、繰り返し参照される少数のエンティティに短い名前を頻繁に使用します。たとえば、頻繁に呼び出されるアプリ固有のサブルーチン。


-2

4〜5文字未満の識別子名は使用しません。たとえば、ループ変数は、何かを達成するために必要な内部ループの数に応じて、IndexまたはjIndexまたはkIndexになりますが、他の名前には「キー」と言います「String LKey」または「int LKey」、メソッド変数の場合はローカルの「L」、プライベートクラス変数の場合は「F」、他のすべての識別子は、その名前に存在する理由を説明する必要があります。 「識別子」スコープは役に立たないですね。


5
「インデックス」は、「i」が付与しないことをどのような追加情報で伝えますか?何も語らない長い変数名は、1文字の変数名よりも悪いです。
アノン。

2
最近、3Dグリッドで機能するものをいくつか書いたので、x、y、zという名前の変数がたくさんありました。文脈を考えると、彼らは完全に説明的でした。
ローレンペクテル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.