È una cattiva pratica nominare una variabile non utilizzata con un singolo trattino basso?


44

Spesso quando la sintassi della lingua mi impone di nominare una variabile che non viene mai utilizzata, la chiamerò _.

Nella mia mente, questo riduce il disordine e mi permette di concentrarmi sulle variabili significative nel codice. Trovo che sia discreto in modo che produca un effetto "lontano dagli occhi, lontano dal cuore".

Un esempio comune di dove lo faccio è la denominazione di sottoquery 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

Un altro esempio è una variabile di ciclo che non viene utilizzata.

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

Uso questa tecnica con parsimonia, solo quando sento che un nome descrittivo non aggiunge nulla al codice e in un certo senso lo toglie aggiungendo altri nomi da ricordare. In un certo senso lo considero simile alla varparola chiave in C #, che uso anche con parsimonia.

I miei colleghi non sono d'accordo. Dicono che anche avere un solo carattere (alfabetico) sia meglio di _.

Ho sbagliato? È una cattiva pratica farlo?


4
Penso che i nomi delle variabili dovrebbero seguire la teoria dell'informazione, cioè la lunghezza è la probabilità reciproca del log del loro uso (le variabili comuni hanno nomi brevi). Una singola lettera alfabetica sembra la strada sbagliata da percorrere.
dan_waterworth

2
@dan_waterworth L'uso di caratteri singoli o doppi come alias di tabella è una pratica abbastanza comune negli script SQL. Dal momento che in genere devi scrivere molti [table].[column]identificatori, aiuta molto la leggibilità da usare [T].[column]. Dipende ovviamente dalla sceneggiatura. Un po 'di selezione del genere va benissimo, ma se uno script fosse molto grande, potrei usare nomi più descrittivi.
CodexArcanum,

5
Preferirei che usassi "manichino". Questo mi grida che sono lì perché il linguaggio richiede una variabile che non ha un contesto semantico al di fuori di queste poche righe. _ non legge bene a un essere umano. (uno dei motivi per cui odio PERL - non riesco
Chris Cudmore

1
Nota a margine: ciò che stai nominando è una tabella derivata , non una sottoquery.
Nick Chammas,

2
La parola chiave var in c # non ha questo significato, è solo una normale dichiarazione di variabili in cui si desume il tipo.
Francesco De Vittori,

Risposte:


60

Tutti i nomi dovrebbero essere significativi. Se _fosse uno standard ben noto nella tua azienda o nella più ampia comunità, sarebbe significativo come un "nome che non ha importanza". In caso contrario, direi che è una cattiva pratica. Usa un nome descrittivo per ciò a cui ti riferisci, soprattutto perché il nome potrebbe avere importanza in futuro.


13
+1. dummysarebbe buono, joined_absarebbe meglio.
Blrfl,

5
+1, c'è una convenzione in cui lavoro per usare '_' per variabili non utilizzate. Penso che sia una buona convenzione, ma sono d'accordo con questa risposta per il caso del PO. Idealmente, le codebase dovrebbero apparire come se fossero state scritte da una sola persona.
dan_waterworth,

20
"_" è uno standard ben noto con Python.
Neil G,

2
Se la tua azienda utilizza Perl, invece, l'uso di $ _ potrebbe causare comportamenti a volte sorprendenti.
Plutor,

2
In prolog, un carattere di sottolineatura indica che la variabile sarà anonima e quindi inutilizzata.
Ivan,

44

Direi che è una pratica accettabile. Questo è un raro caso in cui considererei la maggioranza sbagliata e bisognosa di aggiornare la loro conoscenza delle recenti idee di programmazione. In molte lingue, in particolare linguaggi funzionali basati su ML come Haskell e OCaml, è estremamente comune utilizzare _come variabile "non utilizzata". Perfino Lua, che non offre esplicito supporto linguistico, ne incoraggia l'uso _come segnaposto per convenzione.

Diverse lingue (Haskell, Lua e DI pensano in cima alla mia testa) offrono anche una convenzione in cui le variabili che iniziano con un trattino basso non generano avvisi del compilatore su "variabile locale inutilizzata" che rende _il nome della variabile inutilizzato più breve. Potresti usare qualcosa del genere, _unusedma sono d'accordo con te sul fatto che crea confusione.


Nel caso specifico di SQL, l'ho considerato e i colleghi potrebbero essere corretti qui. Molto comunemente uso una singola lettera maiuscola per gli alias di tabella (e spesso R (esulti) per le sottoselezioni). Penso che usare *in selects sia una cosa molto negativa, perché se la tabella cambia il tuo set di risultati cambia anche inaspettatamente. Quindi in genere avrei bisogno dell'alias a singolo carattere per identificare le colonne che sto selezionando. Se smetti di usare *, smetti di aver bisogno di un nome "non utilizzato".
CodexArcanum,

11
A rigor di termini, almeno in Haskell, _è un modello, non una variabile. È una differenza sottile, ma significa che puoi usarla più volte in qualcosa del genere (x, _, _) = ..., mentre cercare di associare la stessa variabile più volte sarebbe un errore.
Hammar,

12

In Python _è definitivamente accettabile. Può tuttavia essere in conflitto con l' gettextalias _().

Altre convenzioni comuni sono dummy, unused; da solo o come prefisso.

Alcuni strumenti di analisi del codice sono a conoscenza di queste convenzioni e non emetteranno avvisi variabili non utilizzati:

  • PyLint per _odummy
  • PyDev per qualsiasi variabile che inizia con _, unusedodummy

2
Inoltre, l'utilizzo _di variabili fittizie in Python si scontrerà con l' _ultimo valore restituito. Ad esempio, nell'interprete, se lo fai 5*5sulla linea 1; quindi sulla riga 2 _avrà il valore 25. Tuttavia, se imposti x,_ = (3,'not used'), scoprirai che _è ora not usedinvece dell'ultimo valore restituito fino a te del _. Probabilmente non dovresti usare l' _ultimo valore restituito nel codice reale; ma è spesso utile nell'interprete quando si provano nuove cose.
dr jimbob,

4
Bene, _poiché l'ultimo valore restituito funziona solo nella shell interattiva.
Vartec,

Lo stesso vale per Lua. L'uso di _ è pratica standard
sylvanaar

11

Dipende dall'ecosistema in cui vivrà questo codice. Se _è uno standard accettato per indicare "variabile fittizia" / "output inutilizzato", allora attenersi a tutto ciò. In caso contrario, scopri cos'è e usalo.

Alcuni linguaggi di programmazione (ad esempio Haskell) hanno persino questo identificatore "speciale" incorporato nella loro sintassi esattamente per gli scopi menzionati.


5

Attenzione, _ ha già un significato intrinseco in alcune lingue

In Python:

9.6. Variabili private e riferimenti locali di classe

inserisci qui la descrizione del collegamento Le variabili di istanza "private" a cui non è possibile accedere se non dall'interno di un oggetto non esistono in Python. Tuttavia, esiste una convenzione seguita dalla maggior parte del codice Python: un nome preceduto da un trattino basso (ad esempio _spam) deve essere trattato come una parte non pubblica dell'API (che si tratti di una funzione, un metodo o un membro di dati) . Dovrebbe essere considerato un dettaglio di implementazione e soggetto a modifiche senza preavviso.

C'è anche un'altra menzione in PEP 8 (Guida allo stile per Python Code):

Descrittivo: stili di denominazione

_single_leading_underscore: indicatore di "uso interno" debole. Ad esempio da M import * non importa oggetti il ​​cui nome inizia con un trattino basso.

In C #:

Viene generalmente utilizzato per contrassegnare le variabili private che hanno proprietà pubbliche / interne. Ma la pratica è generalmente considerata in questi giorni .

In JavaScript:

Esiste una libreria chiamata underscore.js che utilizza il trattino basso come prefisso per le estensioni di prototipi non standard.

Esempio:

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

Il che mi porta al punto. Cosa c'è che non va nelle classiche convenzioni delle variabili segnaposto.

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

Perché utilizzare una convenzione personalizzata che alcuni potrebbero interpretare erroneamente quando sono già disponibili molte convenzioni comuni?


In Scala: è il simbolo jolly / segnaposto, ma come segnaposto puoi fare riferimento ad esso solo una volta .
Rex Kerr,

@RexKerr Interessante. Sentiti libero di modificarlo nella risposta se vuoi. Vorrei ma non ho familiarità con Scala.
Evan Plaice,

Un commento dovrebbe fare. Chiunque utilizzasse Scala lo saprebbe, e chiunque non usasse Scala probabilmente non avrebbe la compatibilità Scala in cima alla loro lista di motivi per / non fare qualcosa.
Rex Kerr,

Penso che usare uno di quei segnaposto "convenzionali" per le variabili non utilizzate sarebbe una cattiva pratica in quanto mi farebbe pensare, innanzitutto, "perché diavolo questo ragazzo non ha chiamato meglio questa cosa ??" e dopo un po 'avrei scoperto che era perché la variabile non viene utilizzata.
igorsantos07

@ igorsantos07 Sono completamente d'accordo. La mia preferenza sarebbe quella di dare un nome descrittivo, anche per le variabili temporanee. Il punto di questa risposta è dimostrare perché il trattino basso non è una buona scelta per una convenzione di denominazione; per il suo significato preesistente in molte lingue.
Evan Plaice,

2

Uso "manichino" per questo genere di cose. O "merda", se sto solo testando qualcosa :) Dai un nome alle tue variabili per descriverle. Se sono variabili fittizie e non utilizzate, chiamale come tale.


0

Trovo che sia una cattiva pratica perché

  • non dovresti avere variabili invisibili nel tuo codice. Se ritieni che dovresti probabilmente discuterne la ragione.

  • la lingua Go utilizza questa parola chiave per indicare che nessuna variabile è la destinazione di uno dei molteplici ritorni di una funzione. Se la tua lingua non ha più ritorni non è necessario. La tua convenzione di denominazione ti farà male il giorno in cui userai una lingua usando _ come notazione linguistica standard.

(Non conosco Python: questo costrutto è davvero necessario?)


2
Se lo usi per filtrare più ritorni, è solo conseguenza di usarlo anche per argomenti di funzioni fittizie. In effetti, non c'è molta differenza tra i due: nei linguaggi funzionali che corrispondono al modello, puoi scrivere let (a,b,_) = f(x,y,z)altrettanto bene let f(x,y,_) = (g(x),h(x),g(y))o qualunque cosa. - E, sì, è spesso utile avere parametri fittizi: non come l'unica definizione di una funzione, ma per una funzione polimorfica o con definizioni alternative corrispondenti al modello è spesso la cosa naturale da fare.
lasciato circa

1
Il tuo secondo punto contraddice il tuo punto principale: in Go, ciò significa essenzialmente lo stesso di "Non ho alcun valore per questo valore".
Casey Kuball,

0

Potrebbe essere sintatticamente valido e potrebbe essere OK come parte di uno standard.

Detto questo, è qualcosa che vorrei chiedere a qualcuno di cambiare in una revisione del codice. Inoltre non lo metterei mai in uno standard di codifica e proverei a rimuoverlo da uno esistente. È solo più difficile da leggere e non molto significativo.


0

Penso che sia sbagliato perché:

1) È più difficile da vedere in quanto non ci sono molti pixel.

2) Se ce n'è più di uno _, come fai a sapere quale? - o che un nuovo sviluppatore ha "seguito le regole" e ha mantenuto il loro uso estremamente locale?

3) È una pratica che non è utile. L'uso di nomi di variabili a lettera singola è così vecchio stile (cioè la mia istruzione originale!). Li vedrò ... e poi vedrò i commenti aggiunti per dire cosa fa il codice e questa è una cattiva pratica nel mondo di oggi. Uso i nomi delle variabili lunghe il più possibile in modo che tutti, indipendentemente dal livello di programmazione o dalla familiarità con il codice, possano semplicemente "leggerlo" quasi come l'inglese. L'uso di nomi di 1 lettera è una pratica estremamente comune con il codice più vecchio e con i programmatori più vecchi (di nuovo, mi include) ma ciò non lo rende ok.


9
"come fai a sapere quale" non lo fai : questo è esattamente il punto, non usi la variabile. Quindi non importa se _è già utilizzato in un ambito esterno; quello verrà quindi oscurato (o qualunque cosa faccia la tua lingua in questi casi), ma nessuno di questi viene effettivamente utilizzato comunque.
lasciato circa

0

Per evitare le collisioni dello spazio dei nomi e consentire il debug, nel caso in cui il nome della variabile sia l'unico indizio, potrebbe essere meglio chiamarlo "join_ab_unused".

Ispirato da Birfl.


0

Sì, è una cattiva pratica per due motivi:

  1. Il prefisso di una variabile non utilizzata con un carattere di sottolineatura non è uno standard ampiamente accettato. Sarà probabilmente ignorato il "non iniziato".
  2. Ho visto alcune persone prefissare le variabili dei membri privati con un trattino basso e il tuo standard confonderebbe molto queste persone.

0

Quello che stai cercando di fare è codificare in una versione migliore di SQL che non ha il problema di costringerti a inventare un nome per qualcosa di inutile.

Il carattere di sottolineatura è quasi invisibile, quindi sembra che tu sia in quella lingua. Se solo uno spazio bianco potesse essere usato come identificatore, sarebbe perfetto, giusto?

Ma non sei in una lingua diversa e quello che stai facendo non è un modo pulito per estendere la lingua.


0

Dipende dalla lingua. In java , sì, questo è negativo e può essere una tendenza pericolosa da aggiungere al codice, soprattutto perché gli strumenti che usano la riflessione non gestiscono molto bene i trattini bassi, poiché sono al di fuori delle convenzioni di denominazione delle variabili java. In Python , anche questo è negativo ma non altrettanto negativo. Nel clojure , è ok al 100%, e in effetti è idiomatico usare _ come segnaposto in un'istruzione let.

Ricorda che ogni lingua ha la sua intera sintassi e insieme di idiomi, quindi devi valutare il bene / il male in termini di questi idiomi, piuttosto che in termini assoluti.


5
Non sono d'accordo sul fatto che questa è una cattiva pratica in Python. È una convenzione ampiamente compresa
Daenyth,

0

Ciò sarebbe negativo in perl, che utilizza $ _ (e talvolta _) come variabile speciale.

In generale, ne starei lontano solo perché _ sembra essere una lingua specificabile. Se vedessi il tuo codice, sarei nella documentazione alla ricerca di quello che era _, fino a quando non ho realizzato che era solo un manichino. Niente di male con DUMMY, $ DUMMY, qualunque cosa.


0

Eviterei i caratteri di sottolineatura all'inizio di Vars a meno che tu non fossi certo che non tendessero a indicare qualcos'altro in una determinata lingua o quadro in uso intensivo. Ad esempio, in Python, un doppio trattino basso indica un var magico. In JQuery e altre librerie JS un singolo trattino basso indica un var di fallback per le sovrascritture dello spazio dei nomi. È anche una popolare convenzione di denominazione per i file include che a loro volta tendono a ripercuotersi sul codice che gestisce le inclusioni in forma var.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.