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 var
Schlü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?
quelle
[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.Antworten:
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.quelle
dummy
wäre gut,joined_ab
wäre besser.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,_unused
aber ich stimme Ihnen zu, dass es nur Unordnung macht.quelle
*
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._
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.In Python
_
ist definitiv akzeptabel. Es kann jedoch zu einem Konflikt mit demgettext
Alias 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:
_
oderdummy
_
,unused
oderdummy
quelle
_
kollidiert die Verwendung von for-Dummy-Variablen in Python mit dem_
zuletzt zurückgegebenen Wert. ZB im Interpreter, wenn Sie5*5
in Zeile 1 tun ; dann wird in Zeile 2_
der Wert angezeigt25
. Wenn Sie dann jedoch festlegenx,_ = (3,'not used')
, werden Sie feststellen, dass dies_
jetztnot used
der letzte zurückgegebene Wert ist, bis Siedel _
. 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._
da der zuletzt zurückgegebene Wert nur in der interaktiven Shell funktioniert .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.
quelle
Achtung, _ hat in einigen Sprachen bereits eine intrinsische Bedeutung
In Python:
Es gibt auch eine weitere Erwähnung in PEP 8 (Style Guide for Python Code):
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:
Was mich zu meinem Punkt führt. Was stimmt nicht mit den klassischen Konventionen für Platzhaltervariablen?
Warum sollten Sie eine benutzerdefinierte Konvention verwenden, die einige möglicherweise falsch interpretieren, wenn bereits viele gängige Konventionen verfügbar sind?
quelle
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.
quelle
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?)
quelle
let (a,b,_) = f(x,y,z)
genauso gut schreiben wielet 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.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.
quelle
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.
quelle
_
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.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.
quelle
Ja, es ist aus zwei Gründen eine schlechte Praxis:
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle