未使用の変数に単一のアンダースコアを付けるのは悪い習慣ですか?


44

多くの場合、言語の構文で使用されない変数に名前を付ける必要がある場合は、名前を付け_ます。

私の考えでは、これにより混乱が減り、コード内の意味のある変数に集中できます。「目立たない、気にしない」効果を生み出すように、目立たないことがわかりました。

私がこれを行う場所の一般的な例は、SQLでサブクエリに名前を付けることです。

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

別の例は、使用されないループ変数です。

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

わかりやすい名前がコードに何も追加しないと感じた場合にのみ、この手法を非常に控えめに使用します。いくつかの点varで、C#のキーワードに似ていると考えていますが、これも控えめに使用しています。

私の同僚は同意しません。彼らは、単一の(アルファベットの)文字名を持つことでさえもより良いと言い_ます。

私が間違っている?これを行うのは悪い習慣ですか?


4
変数名は情報理論に従うべきだと思います。つまり、長さはそれらの使用の対数確率の対数です(一般的な変数には短い名前があります)。1つのアルファベット文字は間違った方法のように思えます。
dan_waterworth

2
@dan_waterworthテーブルエイリアスとしての単一または二重文字の使用は、SQLスクリプトではかなり一般的な方法です。通常、多くの[table].[column]識別子を記述する必要があるため、単に使用するだけで読みやすくなります[T].[column]。もちろんスクリプトに依存します。そのような選択はまったく問題ありませんが、スクリプトが非常に大きい場合は、よりわかりやすい名前を使用する可能性があります。
CodexArcanum

5
むしろ「ダミー」を使用したいです。これは、言語がこれらの数行の外側にセマンティックコンテキストを持たない変数を必要とするため、それらが存在することを私に叫んでいます。_は人間にはよく読めません。(PERLが嫌いな理由の1つ-入力も読み取りもできない)
クリスカドモア

1
サイドノート:ここで名前を付けているのは、サブクエリではなく、派生テーブルです。
ニックチャマス

2
c#のvarキーワードにはこの意味はなく、型が推測される通常の変数宣言にすぎません。
フランチェスコデヴィットーリ

回答:


60

すべての名前には意味があります。_あなたの会社またはより広いコミュニティでよく知られている標準であれば、「重要ではない名前」として意味があります。そうでない場合、それは悪い習慣だと思います。特に将来名前が重要になる可能性があるため、参照するものにはわかりやすい名前を使用してください。


13
+1。 dummy良いでしょう、良いjoined_abでしょう。
Blrfl

5
+1、未使用の変数に「_」を使用するように働く慣習があります。良い慣習だと思いますが、OPの場合のこの答えには同意します。理想的には、コードベースは1人の人間が作成したように見えるはずです。
dan_waterworth

20
「_」は、Pythonでよく知られている標準です。
ニールG

2
一方、会社でPerlを使用している場合、$ _を使用すると、驚くべき動作が発生することがあります。
プルーター

2
プロローグでは、アンダースコアは変数が匿名であり、したがって使用されないことを示します。
イヴァン

44

私はそれが受け入れられる慣行だと言うでしょう。これは、私が過半数が間違っていると見なし、最近のプログラミングのアイデアに関する知識を更新する必要があると考えるまれな例です。多くの言語、特にHaskellやOCamlのようなMLベースの関数型言語では_、「未使用」変数として使用することが非常に一般的です。明示的な言語サポートを提供していないLuaでさえ、_慣例によりプレースホルダーとしての使用を推奨しています。

いくつかの言語(Haskell、Lua、およびDIは私の頭の中で考えます)も、アンダースコアで始まる変数が、「未使用のローカル変数」に関するコンパイラ警告を生成しないという規則を提供し_ます。あなたは次のようなものを使用でき_unusedますが、それはただ混乱を招くだけであることに同意します。


SQLの特定のケースでは、私はそれを検討しており、同僚はここで正しいかもしれません。私は非常に一般的には、テーブルエイリアスに1つの大文字を使用します(そして、サブセレクトにはしばしばR(esults)を使用します)。*テーブルを変更すると、結果セットも予期せず変更されるため、select で使用することは非常に悪いことだと思います。そのため、通常、選択している列を識別するために1文字のエイリアスが必要になります。の使用*を停止すると、「未使用」の名前が不要になります。
CodexArcanum

11
厳密に言えば、少なくともHaskellでは_、変数ではなくパターンです。これは微妙な違いですが(x, _, _) = ...、同じ変数を複数回バインドしようとするとエラーになるのに対して、のように複数回使用できることを意味します。
ハンマー

12

Python _では間違いなく受け入れられます。ただし、gettextalias と競合する可能性があり_()ます。

他の一般的な規則がありdummyunused。単独または接頭辞として。

一部のコード分析ツールはこれらの規則を認識しており、未使用の変数警告を発行しません。

  • PyLintのため_dummy
  • 始まる変数のPyDev_unusedまたはdummy

2
また、_Pythonでダミー変数に使用すると_、最後に返された値と衝突します。たとえば、インタープリターで、5*51行目で行う場合。次に、行2 _に値があります25。ただし、その後に設定x,_ = (3,'not used')すると、最後の戻り値ではなく、_not usedまでの値になりますdel __実際のコードで最後に返された値に使用すべきではないでしょう。しかし、新しいものを試す際に通訳に役立つことがよくあります。
ジンボブ博士12年

4
さて、_最後に返された値は対話型シェルでのみ機能します。
バルテック

同じことがLuaにも当てはまります。_を使用するのが標準的な方法です
シルバナール

11

このコードが存在するエコシステムに依存します。ifが_「ダミー変数」/「未使用出力」を示す標準として受け入れられている場合は、必ずそれに従ってください。そうでない場合は、それが何であるかを見つけて使用します。

一部のプログラミング言語(Haskellなど)では、この「特別な」識別子も、まさにあなたが言及した目的のために構文に組み込まれています。


5

注意、_は一部の言語で既に本質的な意味を持っています

Pythonの場合:

9.6。プライベート変数とクラスローカル参照

ここにリンクの説明を入力します。「プライベート」インスタンス変数は、Pythonには存在しないオブジェクトの内部からのみアクセスできます。ただし、ほとんどのPythonコードが従う慣習があります。アンダースコアで始まる名前(_spamなど)は、APIの非公開部分(関数、メソッド、データメンバーのいずれか)として扱われるべきです。 。実装の詳細と見なされ、予告なく変更される場合があります。

PEP 8(Pythonコードのスタイルガイド)にも別の言及があります:

記述:命名スタイル

_single_leading_underscore:弱い「内部使用」インジケータ。たとえば、M import *からは、名前がアンダースコアで始まるオブジェクトはインポートされません。

C#の場合:

一般に、パブリック/内部プロパティを持つプライベート変数をマークするために使用されます。しかし、最近の慣習は軽downされています

JavaScriptの場合:

非標準のプロトタイプ拡張機能のプレフィックスとしてアンダースコアを使用するunderscore.jsというライブラリがあります。

例:

var object = { some:'stuff' };
var newObject = _.clone(object);

それは私のポイントに私を導きます。従来のプレースホルダー変数の規則の何が問題になっていますか。

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

すでに多くの一般的な規則が利用可能であるときに、一部が誤って解釈する可能性があるカスタム規則を使用するのはなぜですか?


Scalaでは、ワイルドカード/プレースホルダーシンボルですが、プレースホルダーとして参照できるのは1回だけです。
レックスカー

@RexKerr興味深い。必要に応じて、自由に編集して回答に追加してください。私はそうしますが、私はscalaに慣れていません。
エヴァンプライス

コメントをする必要があります。Scalaを使用している人なら誰でも知っていて、Scalaを使用していない人はおそらく、何かをする/しない理由のリストの一番上にScalaとの互換性がないでしょう。
レックスカー

未使用の変数にこれらの「慣習」プレースホルダーの1つを使用することは、最初に「この男はなぜこの名前をよく付けなかったのか?」しばらくすると、変数が使用されていないためだとわかりました。
igorsantos07

@ igorsantos07私は完全に同意します。私の好みは、一時変数であっても説明的な名前を付けることです。この答えのポイントは、アンダースコアが命名規則にとって適切な選択ではない理由を示すことです。多くの言語でその既存の意味のために。
エヴァンプライス

2

私はそのようなことのために「ダミー」を使用します。または、単にテストするだけの場合は「がらくた」:)変数に名前を付けて、それが何であるかを説明します。ダミーの未使用変数の場合は、そのような名前を付けます。


0

悪い習慣だと思う

  • コードに不可視の変数を含めるべきではありません。もしあなたがあなたがそうすべきだと思うなら、おそらく議論することができるでしょう。

  • Go言語はこのキーワードを使用して、関数の複数の戻り値のいずれかの変数が宛先であることを示します。言語に複数の戻り値がない場合は必要ありません。命名規則は、_を標準言語表記として使用する言語を使用する日を痛めます。

(私はPythonを知らない:この構成は本当に必要なのか?)


2
複数のリターンをフィルタリングするために使用する場合、ダミー関数の引数にも使用するだけです。実際、この2つの間に大きな違いはありません。パターンマッチング関数型言語では、let (a,b,_) = f(x,y,z)と同様に記述できますlet f(x,y,_) = (g(x),h(x),g(y))。—そして、はい、多くの場合、ダミーパラメーターを使用すると便利です。関数の唯一の定義としてではなく、ポリモーフィック関数または代替パターンマッチング定義を持つ関数の場合は、自然なことです。
左辺約

1
2番目の点はあなたの主な点と矛盾します。Goでは、これは基本的に「この値を使用しない」と同じことを意味します。
ケーシークーボール

0

構文的に有効な場合があり、標準の一部としては問題ない場合があります。

そうは言っても、コードレビューで変更するように誰かに頼むでしょう。また、コーディング標準に決して入れず、既存のものから削除しようとします。読むのはもっと難しく、あまり意味がありません。


0

私はそれが間違っていると思う:

1)ピクセルが少ないため、見づらいです。

2)複数ある場合_、どれをどのように知るのですか?-または、新しい開発者が「規則に従って」、その使用を範囲内で非常にローカルに維持していることですか?

3)役に立たない習慣です。1文字の変数名を使用するのはとても古いです(つまり、私の最初の教育です!)。私はそれらを見るでしょう...そして、コードが何をするかを言うために追加されたコメントを見るでしょう、そしてそれは今日の世界では悪い習慣です。私はできる限り長い変数名を使用しているため、プログラミングレベルやコードの知識に関係なく、誰でも英語のように「読む」ことができます。1文字の名前を使用することは、古いコードや古いプログラマー(ここでも私を含む)で非常に一般的な方法ですが、それで問題はありません。


9
「どのようにしてどれを知るのか」あなたは知らない:それがまさにポイントであり、変数を使用しない。したがって_、が外側のスコープで既に使用されているかどうかは関係ありません。その場合、その1つはシャドウされます(または、そのような場合にあなたの言語が行うことは何でも)が、いずれにしても実際には使用されません。
左辺約

0

名前空間の衝突を避け、デバッグを可能にするために、変数名が唯一の手がかりである場合、「joined_ab_unused」と呼ぶ方が良いかもしれません。

Birflに触発されました。


0

はい、それは2つの理由で悪い習慣です:

  1. 未使用の変数の前にアンダースコアを付けることは、広く受け入れられている標準ではありません。「未開始」はおそらく無視されます。
  2. プライベートメンバー変数の前にアンダースコアを付ける人がいるのを見て、あなたの標準はそのような人を大きく混乱させるでしょう。

0

あなたがやろうとしているのは、役に立たないものの名前を発明するように強制する問題を持たない、より良いバージョンのSQLでコーディングすることです。

アンダースコアはほとんど見えないため、その言語で表示されているように見えます。空白のみを識別子として使用できる場合、それは完璧でしょう?

しかし、あなたは別の言語ではなく、あなたがしていることは言語拡張を作るためのきれいな方法ではありません。


0

言語に依存します。ではJavaの、はい、これは彼らが外部のJavaの変数の命名規則のであるため、ツールが使用反射が、非常によくアンダースコアを処理していないことを主な理由、悪いですし、あなたのコードに追加する危険な傾向することができます。python、これも悪くはなく、悪いようです。ではClojureは、その100%大丈夫、実際には、その慣用は、let文にプレースホルダとして_のを使用します。

各言語には独自の構文と一連のイディオムがあるため、絶対的な用語ではなく、これらのイディオムの観点から良い/悪いを評価する必要があります。


5
私はこれがPythonの悪い習慣であることに同意しません。それは広く理解されている慣習です
-Daenyth

0

これは、特殊変数として$ _(および場合によっては_)を使用するperlでは不適切です。

一般的に、_が言語固有の変数であると思われるため、私はそれから離れたままにします。あなたのコードを見たら、それが単なるダミーであると気づくまで、_が何であるかを探してドキュメントを探していました。DUMMY、$ DUMMYなど、何も問題はありません。


0

使用頻度の高い特定の言語やフレームワークで他の何かを示す傾向がないことが確実でない限り、varの先頭にアンダースコアを付けないようにします。たとえば、Pythonでは、二重アンダースコアは魔法の変数を示す傾向があります。JQueryおよびその他のJSライブラリでは、単一のアンダースコアがネームスペースの上書きのフォールバック変数を示す傾向があります。また、インクルードファイルの一般的な命名規則であり、インクルードファイルは、インクルードをvar形式で処理するコードに引き継ぐ傾向があります。

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