Ist es eine schlechte Praxis, eine nicht verwendete Variable mit einem einzelnen Unterstrich zu benennen?

44

Wenn ich aufgrund der Syntax der Sprache eine Variable benennen muss, die nie verwendet wird, werde ich sie oft benennen _.

In meinen Augen reduziert dies die Unordnung und ermöglicht es mir, mich auf die aussagekräftigen Variablen im Code zu konzentrieren. Ich finde es unauffällig, so dass es einen "out of sight, out of mind" -Effekt erzeugt.

Ein häufiges Beispiel dafür, wo ich das mache, ist das Benennen von Unterabfragen in 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

Ein weiteres Beispiel ist eine nicht verwendete Schleifenvariable.

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

Ich benutze diese Technik sehr sparsam, nur wenn ich das Gefühl habe, dass ein beschreibender Name dem Code nichts hinzufügt und ihn in gewisser Weise durch Hinzufügen weiterer zu merkender Namen aufhebt. In gewisser Weise sehe ich es ähnlich wie das varSchlüsselwort in C #, das ich auch sparsam verwende.

Meine Mitarbeiter sind anderer Meinung. Sie sagen, dass sogar ein einzelner (alphabetischer) Zeichenname besser ist als _.

Liege ich falsch? Ist es schlechte Praxis, dies zu tun?

Kris Harper
quelle
4
Ich denke, Variablennamen sollten der Informationstheorie folgen, dh die Länge ist die logarithmische Wahrscheinlichkeit ihrer Verwendung (allgemeine Variablen haben kurze Namen). Ein einzelner alphabetischer Buchstabe scheint der falsche Weg zu sein.
Dan_waterworth
2
@dan_waterworth Die Verwendung von einfachen oder doppelten Zeichen als Tabellen-Aliase ist in SQL-Skripten weit verbreitet. Da Sie in der Regel viele [table].[column]Bezeichner schreiben müssen , ist es hilfreich, die Lesbarkeit häufig nur zu verwenden [T].[column]. Das hängt natürlich vom Drehbuch ab. Eine kleine Auswahl wie diese ist völlig in Ordnung, aber wenn ein Skript sehr umfangreich ist, verwende ich möglicherweise aussagekräftigere Namen.
CodexArcanum
5
Ich würde lieber "Dummy" verwenden. Das schreit für mich, dass sie da sind, weil die Sprache eine Variable benötigt, die außerhalb dieser wenigen Zeilen keinen semantischen Kontext hat. _ liest einem Menschen nicht gut vor. (Einer der Gründe, warum ich PERL hasse - ich kann es nicht schreiben oder lesen)
Chris Cudmore
1
Randnotiz: Was Sie dort benennen, ist eine abgeleitete Tabelle , keine Unterabfrage.
Nick Chammas
2
Das var-Schlüsselwort in c # hat diese Bedeutung nicht, es ist nur eine normale Variablendeklaration, bei der der Typ abgeleitet wird.
Francesco De Vittori

Antworten:

60

Alle Namen sollten aussagekräftig sein. Wenn dies _in Ihrem Unternehmen oder in der breiteren Gemeinschaft ein bekannter Standard wäre, wäre dies als "Name, der keine Rolle spielt" sinnvoll. Wenn nicht, würde ich sagen, es ist schlechtes Training. Verwenden Sie einen aussagekräftigen Namen für das, worauf Sie sich beziehen, zumal der Name in Zukunft eine Rolle spielen könnte.

Telastyn
quelle
13
+1. dummywäre gut, joined_abwäre besser.
Blrfl
5
+1, Es gibt eine Konvention, in der ich arbeite, um '_' für nicht verwendete Variablen zu verwenden. Ich denke, es ist eine gute Konvention, aber ich stimme dieser Antwort für den Fall des OP zu. Idealerweise sollten Codebasen so aussehen, als ob sie von einer einzelnen Person geschrieben wurden.
dan_waterworth
20
"_" ist ein bekannter Standard in Python.
Neil G
2
Wenn Ihr Unternehmen hingegen Perl verwendet, kann die Verwendung von $ _ manchmal zu überraschendem Verhalten führen.
Plutor
2
In Prolog bedeutet ein Unterstrich, dass die Variable anonym ist und daher nicht verwendet wird.
Ivan
44

Ich würde sagen, dass es eine akzeptable Praxis ist. Dies ist ein seltener Fall, in dem ich die Mehrheit für falsch halte und ihr Wissen über die neuesten Programmierideen auf den neuesten Stand bringen muss. In vielen Sprachen, insbesondere in ML-basierten funktionalen Sprachen wie Haskell und OCaml, ist die Verwendung _als "unbenutzte" Variable äußerst verbreitet . Selbst Lua, die keine explizite Sprachunterstützung bietet, empfiehlt die Verwendung _als Platzhalter gemäß Konvention.

Einige Sprachen (Haskell, Lua und DI denken über den Kopf) bieten auch eine Konvention, bei der Variablen, die mit einem Unterstrich beginnen, keine Compiler-Warnungen über "nicht verwendete lokale Variable" generieren, wodurch _der kürzeste nicht verwendete Variablenname entsteht. Sie könnten so etwas gebrauchen, _unusedaber ich stimme Ihnen zu, dass es nur Unordnung macht.

CodexArcanum
quelle
In dem speziellen Fall von SQL habe ich darüber nachgedacht und die Mitarbeiter können hier richtig sein. Ich benutze sehr häufig einen einzelnen Großbuchstaben für Tabellen-Aliase (und oft R (esults) für Unterauswahlen). Ich denke, dass die Verwendung *in Selects eine sehr schlechte Sache ist, denn wenn sich die Tabelle ändert, ändert sich auch Ihre Ergebnismenge unerwartet. Normalerweise benötige ich den Alias ​​für ein einzelnes Zeichen, um die von mir ausgewählten Spalten zu identifizieren. Wenn Sie aufhören zu verwenden *, brauchen Sie keinen "nicht verwendeten" Namen mehr.
CodexArcanum
11
Streng genommen ist zumindest in Haskell _ein Muster, keine Variable. Es ist ein subtiler Unterschied, aber es bedeutet, dass Sie es mehrmals in so etwas wie verwenden können (x, _, _) = ..., wohingegen der Versuch, dieselbe Variable mehrmals zu binden, ein Fehler wäre.
Hammar
12

In Python _ist definitiv akzeptabel. Es kann jedoch zu einem Konflikt mit dem gettextAlias ​​kommen _().

Andere gängige Konventionen sind dummy, unused; allein oder als Präfix.

Einige Codeanalyse-Tools kennen diese Konventionen und geben keine Warnungen für nicht verwendete Variablen aus:

  • PyLint für _oderdummy
  • PyDev für jede Variable ab _, unusedoderdummy
vartec
quelle
2
Außerdem _kollidiert die Verwendung von for-Dummy-Variablen in Python mit dem _zuletzt zurückgegebenen Wert. ZB im Interpreter, wenn Sie 5*5in Zeile 1 tun ; dann wird in Zeile 2 _der Wert angezeigt 25. Wenn Sie dann jedoch festlegen x,_ = (3,'not used'), werden Sie feststellen, dass dies _jetzt not usedder letzte zurückgegebene Wert ist, bis Sie del _. Sie sollten wahrscheinlich nicht _für den zuletzt zurückgegebenen Wert in echtem Code verwenden. aber es ist oft im Interpreter nützlich, wenn man neue Sachen ausprobiert.
Dr. Jimbob
4
Nun, _da der zuletzt zurückgegebene Wert nur in der interaktiven Shell funktioniert .
Vartec
Das gilt auch für Lua. Die Verwendung von _ ist Standard
Sylvanaar
11

Es hängt von dem Ökosystem ab, in dem dieser Code leben wird. Wenn _es sich um einen akzeptierten Standard handelt, der "Dummy-Variable" / "nicht genutzte Ausgabe" angibt, bleiben Sie auf jeden Fall dabei. Wenn nicht, finden Sie heraus, was ist und verwenden Sie das.

Einige Programmiersprachen (z. B. Haskell) haben sogar diesen speziellen Bezeichner in ihrer Syntax für genau die Zwecke, die Sie erwähnen.

tdammers
quelle
5

Achtung, _ hat in einigen Sprachen bereits eine intrinsische Bedeutung

In Python:

9.6. Private Variablen und klassenlokale Referenzen

Geben Sie hier eine Linkbeschreibung ein. Auf „Private“ Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann, ist in Python kein Zugriff möglich. Es gibt jedoch eine Konvention, die von den meisten Python-Codes befolgt wird: Ein Name mit einem vorangestellten Unterstrich (z. B. _spam) sollte als nicht öffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). . Es sollte als Implementierungsdetail betrachtet werden und kann ohne vorherige Ankündigung geändert werden.

Es gibt auch eine weitere Erwähnung in PEP 8 (Style Guide for Python Code):

Beschreibend: Benennen von Stilen

_single_leading_underscore: schwacher Indikator für "internen Gebrauch". ZB aus M import * importiert keine Objekte, deren Name mit einem Unterstrich beginnt.

In C #:

Es wird im Allgemeinen verwendet, um private Variablen mit öffentlichen / internen Eigenschaften zu markieren. Aber die Praxis wird heutzutage allgemein herabgeschaut .

In JavaScript:

Es gibt eine Bibliothek mit dem Namen underscore.js, die den Unterstrich als Präfix für nicht standardmäßige Prototyperweiterungen verwendet.

Beispiel:

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

Was mich zu meinem Punkt führt. Was stimmt nicht mit den klassischen Konventionen für Platzhaltervariablen?

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

Warum sollten Sie eine benutzerdefinierte Konvention verwenden, die einige möglicherweise falsch interpretieren, wenn bereits viele gängige Konventionen verfügbar sind?

Evan Scholle
quelle
In Scala: Es ist das Platzhalter- / Platzhaltersymbol, aber als Platzhalter können Sie nur einmal darauf verweisen .
Rex Kerr
@RexKerr Interessant. Fühlen Sie sich frei, das in die Antwort zu bearbeiten, wenn Sie wollen. Ich würde, aber ich bin nicht mit Scala vertraut.
Evan Plaice,
Ein Kommentar sollte reichen. Jeder, der Scala verwendet, würde es wissen, und jeder, der Scala nicht verwendet, würde wahrscheinlich nicht die Scala-Kompatibilität ganz oben auf der Liste der Gründe haben, etwas zu tun / nicht zu tun.
Rex Kerr
Ich denke, es wäre eine schlechte Praxis, einen dieser "Konventions" -Platzhalter für nicht verwendete Variablen zu verwenden, da ich zuerst denken würde, "warum zum Teufel hat dieser Typ das Ding nicht besser benannt?" und nach einer weile würde ich dann feststellen, dass es daran lag, dass die variable nicht verwendet wird.
igorsantos07
@igorsantos07 da stimme ich voll zu. Ich würde es vorziehen, auch für temporäre Variablen einen aussagekräftigen Namen zu vergeben. Mit dieser Antwort soll aufgezeigt werden, warum der Unterstrich keine gute Wahl für eine Namenskonvention ist. aufgrund seiner bereits bestehenden Bedeutung in vielen Sprachen.
Evan Plaice
2

Ich benutze "Dummy" für solche Sachen. Oder "Mist", wenn ich nur etwas ausprobiere :) Nennen Sie Ihre Variablen, um zu beschreiben, was sie sind. Wenn es sich um Dummy-Variablen handelt, die nicht verwendet werden, benennen Sie sie als solche.

Phillip Schmidt
quelle
0

Ich finde es schlecht, weil

  • Sie sollten keine unsichtbare Variable in Ihrem Code haben. Wenn Sie der Meinung sind, dass Sie sollten, könnte der Grund wahrscheinlich besprochen werden.

  • Die Sprache Go verwendet dieses Schlüsselwort, um anzugeben, dass keine Variable das Ziel einer der mehreren Rückgaben einer Funktion ist. Wenn Ihre Sprache nicht mehrere Rückgaben hat, wird sie nicht benötigt. Ihre Namenskonvention wird Sie an dem Tag verletzen, an dem Sie eine Sprache verwenden, die _ als Standardnotation verwendet.

(Ich kenne Python nicht. Wird dieses Konstrukt wirklich benötigt?)

Denys Séguret
quelle
2
Wenn Sie es zum Filtern mehrerer Rückgaben verwenden, ist es nur folgerichtig, es auch für Dummy-Funktionsargumente zu verwenden. Tatsächlich gibt es keinen großen Unterschied zwischen den beiden: In funktionalen Mustersprachen können Sie let (a,b,_) = f(x,y,z)genauso gut schreiben wie let f(x,y,_) = (g(x),h(x),g(y))oder was auch immer. - Und ja, es ist oft nützlich, Dummy-Parameter zu haben: Nicht als einzige Definition einer Funktion, sondern für eine polymorphe Funktion oder eine mit alternativen musterangepassten Definitionen ist es oft die natürliche Sache.
links um
1
Ihr zweiter Punkt widerspricht Ihrem Hauptpunkt: In Go bedeutet das im Wesentlichen dasselbe wie "Ich habe keinen Sinn für diesen Wert".
Casey Kuball
0

Es kann syntaktisch gültig und als Teil eines Standards in Ordnung sein.

Vor diesem Hintergrund würde ich jemanden bitten, die Codeüberprüfung zu ändern. Ich würde es auch niemals in einen Kodierungsstandard einbauen und versuchen, es aus einem existierenden zu entfernen. Es ist nur schwieriger zu lesen und nicht sehr aussagekräftig.

Alan Delimon
quelle
0

Ich denke, es ist falsch, weil:

1) Es ist schwerer zu erkennen, da es nicht viele Pixel gibt.

2) Wenn es mehr als eine gibt _, woher weißt du welche? - oder dass ein neuer Entwickler "die Regeln befolgt" und ihre Verwendung äußerst lokal gehalten hat?

3) Es ist eine Praxis, die nicht hilfreich ist. Die Verwendung von Variablennamen mit einem Buchstaben ist so altmodisch (dh meine ursprüngliche Ausbildung!). Ich werde sie sehen ... und dann werden Kommentare hinzugefügt, um zu sagen, was der Code tut, und das ist eine schlechte Praxis in der heutigen Welt. Ich benutze so oft wie möglich lange Variablennamen, damit jeder, ungeachtet der Programmierebene oder der Vertrautheit mit dem Code, ihn fast wie Englisch "lesen" kann. Die Verwendung von 1-Buchstaben-Namen ist eine äußerst häufige Praxis mit älterem Code und mit älteren Programmierern (schließt mich wieder ein), aber das macht es nicht ok.

Junkie
quelle
9
„Wie Sie wissen, welche ein“ Sie dies nicht tun : Das ist genau der Punkt, Sie nicht die Variable verwenden. Es spielt also auch keine Rolle, ob _es bereits in einem äußeren Bereich verwendet wird; Dieser wird dann abgeschattet (oder was auch immer Ihre Sprache in solchen Fällen tut), aber keiner von ihnen wird tatsächlich sowieso verwendet.
linksum
0

Um Namespace-Kollisionen zu vermeiden und das Debuggen zu ermöglichen, ist es möglicherweise besser, den Variablennamen als "join_ab_unused" zu bezeichnen.

Inspiriert von Birfl.

Hack Saw
quelle
0

Ja, es ist aus zwei Gründen eine schlechte Praxis:

  1. Das Präfixieren einer nicht verwendeten Variablen mit einem Unterstrich ist kein allgemein akzeptierter Standard. Es wird wahrscheinlich der "Uneingeweihte" ignoriert.
  2. Ich habe einige Leute gesehen, die privaten Mitgliedsvariablen einen Unterstrich voranstellen , und Ihr Standard würde solche Leute sehr verwirren.
Jim G.
quelle
0

Was Sie versuchen, ist Code in einer schöneren Version von SQL zu schreiben, die Sie nicht zwingt, einen Namen für etwas Nutzloses zu erfinden.

Der Unterstrich ist fast unsichtbar, sodass Sie anscheinend in dieser Sprache sprechen. Wenn nur Whitespace als Bezeichner verwendet werden könnte, wäre es perfekt, oder?

Aber Sie sprechen keine andere Sprache und was Sie tun, ist keine saubere Möglichkeit, eine Spracherweiterung vorzunehmen.

Kaz
quelle
0

Das hängt von der Sprache ab. Ja, in Java ist dies schlecht und ein gefährlicher Trend, der Ihrem Code hinzugefügt werden kann, vor allem, weil Tools, die Reflektion verwenden, Unterstriche nicht sehr gut verarbeiten, da sie außerhalb der Namenskonventionen für Java-Variablen liegen. In Python ist das auch schlecht, aber nicht so schlecht. In der Regel ist es zu 100% in Ordnung, und in der Tat ist es idiomatisch, _s als Platzhalter in einer let-Anweisung zu verwenden.

Denken Sie daran, dass jede Sprache ihre eigene Syntax und ihren eigenen Satz von Redewendungen hat. Sie müssen also gut / schlecht in Bezug auf diese Redewendungen und nicht in absoluten Werten bewerten.

jayunit100
quelle
5
Ich bin nicht einverstanden, dass dies eine schlechte Übung in Python ist. Es ist eine weit verbreitete Konvention
Daenyth
0

Dies wäre schlecht in Perl, das $ _ (und manchmal _) als spezielle Variable verwendet.

Im Allgemeinen würde ich mich davon fernhalten, nur weil das _ eine Sprache zu sein scheint, die spezifisch für eine Variable ist. Wenn ich Ihren Code sehen würde, würde ich in der Dokumentation nach dem suchen, was _ ist, bis mir klar wird, dass es nur ein Dummy ist. Nichts ist falsch mit DUMMY, $ DUMMY, was auch immer.

Reiche Homolka
quelle
0

Ich würde Unterstriche am Anfang von Variablen vermeiden, es sei denn, Sie waren sich sicher, dass sie in einer bestimmten Sprache oder einem stark genutzten Framework nicht dazu tendieren, etwas anderes anzuzeigen. In Python weist beispielsweise ein doppelter Unterstrich tendenziell auf eine magische Var hin. In JQuery- und anderen JS-Bibliotheken weist ein einzelner Unterstrich tendenziell auf eine Ausweichvariable für das Überschreiben von Namespaces hin. Es ist auch eine beliebte Namenskonvention für Include-Dateien, die wiederum dazu neigen, Code zu übertragen, der Include-Dateien in Var-Form verarbeitet.

Erik Reppen
quelle