L'uso di variabili di una lettera è incoraggiato? [chiuso]


13

L'uso di variabili di una lettera è incoraggiato in Java? Nei frammenti di codice o nei tutorial, li vedi spesso. Non posso immaginare che usarli sia incoraggiato perché rende il codice relativamente più difficile da leggere e non li vedo mai essere usati in altri linguaggi di programmazione!


3
Sì e no. Dipende completamente dalla situazione.
Zavior,




1
Non sempre rende il codice più difficile da leggere. Ad esempio, quando si implementa un codice basato su equazioni matematiche, di solito ha senso utilizzare gli stessi nomi di variabili utilizzati nelle equazioni. (I commenti rimandano al documento / testo in cui si trovano le equazioni originali, o se sei come me, a volte includi il codice LaTeX per loro.)
jamesqf

Risposte:


32

Denominare correttamente le cose è difficile. Molto difficile. Se lo guardi dall'altra parte, puoi anche prendere questo per significare che le cose con un nome appropriato sono importanti. (Altrimenti, perché avresti speso lo sforzo per nominarlo?)

Ma, a volte, i nomi delle cose non sono importanti. Ecco perché abbiamo cose come funzioni anonime ("lambda"), per esempio: perché a volte non vale la pena nominare cose.

Ci sono molti esempi in cui i nomi delle variabili a lettera singola (o molto brevi) sono appropriati:

  • i, j, k, lPer gli indici di loop
  • ke vper la chiave e il valore in una mappa
  • nper un numero (ad es. in Math.abs(n))
  • a, b, cPer oggetti arbitrari (ad esempio in max(a, b))
  • eper l'elemento in un for eachciclo generico
  • f per la funzione in una funzione di ordine superiore
  • p per la funzione predicato in un filtro
  • T, T1, T2, ... per le variabili di tipo
  • E per variabili di tipo che rappresentano il tipo di elemento di una raccolta
  • R per una variabile di tipo che rappresenta il tipo di risultato di una funzione
  • exper l'eccezione in una catchclausola
  • op per l'operazione in una mappa o piega
  • aggiungendo la lettera sper indicare il plurale, ovvero una raccolta (ad esempio nsper una raccolta di numeri xse ysper due raccolte arbitrarie di oggetti generici)

Non li vedo mai usati in altri linguaggi di programmazione!

Sono molto comuni in quasi tutte le lingue che conosco (e probabilmente anche in quelle che non conosco). Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, lo chiami.


5
-1 L'uso di nomi di variabili di una lettera è una programmazione pigra. A volte va bene essere pigri, ma se ti stai alzando in ke lnegli indici di loop, è troppo lontano (non dovresti avere così tanti loop nidificati per cominciare; estraili in funzioni) . Personalmente, non utilizzo mai più di una variabile di 1 lettera per funzione, ma scatto a 0.
BlueRaja - Danny Pflughoeft

Inoltre, lo lenviene utilizzato per una lunghezza e arrper un array (ad esempio:) for(var i=0; l=arr.length; i<l; i++). Inoltre, fnpuò essere utilizzato al posto di fquando si fa riferimento a una funzione.
Ismael Miguel,

4
@ BlueRaja-DannyPflughoeft Preferisco pensarlo come una programmazione efficiente. Jorg potrebbe probabilmente espandersi quando le singole lettere sono appropriate, non solo dove, ma a dire il vero immagino che la maggior parte dei programmatori tracci la linea in modo diverso. Per quanto riguarda gli indici di loop, potrei sostenere che qualsiasi codice in cui gli indici non necessitano di nomi con valore semantico è abbastanza semplice da giustificare l'annidamento multilivello rispetto all'estrazione non necessaria. Potrebbero anche essere utilizzati in circuiti separati per evitare possibili problemi di scoping che Nelson solleva .
Lilienthal,

2
@Lilienthal: il codice deve essere efficiente da leggere, non efficiente da scrivere. Di solito sono la stessa cosa, ma non sempre, come in questo caso.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Non in tutti i programmi no, ma non vedo nulla di sbagliato nei suggerimenti di Jorg. Come diceva Killian : "Nulla di più non può rendere la semantica più ovvia, ma impiega molto più tempo a leggere". Ma questo è probabilmente in gran parte una questione di preferenze e stile personali.
Lilienthal,

20

Se il tuo ciclo non fa altro che usare una variabile per il conteggio

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

allora sì, questo è il nome migliore che potresti usare. Nulla di più non può rendere la semantica più ovvia, ma richiede molto più tempo per la lettura.

Se la variabile viene utilizzata all'interno del ciclo, può essere utile un nome significativo.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Se la tua variabile viene utilizzata a livello di metodo, il suo nome dovrebbe essere più lungo; se viene utilizzato a livello di classe, il suo nome dovrebbe essere totalmente autoesplicativo, altrimenti quasi sicuramente diminuirà la chiarezza del codice.

In breve, maggiore è l'ambito della variabile, più lungo deve essere il suo nome.


Onestamente, sono arrivato al punto in cui non userò i nomi delle variabili di un personaggio, punto. Cerco di usare nomi che ne spieghino l'utilizzo, anche per i contatori. In genere index, ad esempio, utilizzerei una variabile denominata durante l'iterazione su un array.
Michael,

13
@Michael: Secondo me, il gergo di programmazione è la sua lingua, non è proprio l'inglese. E in quella lingua, iè una parola corretta con un significato definito con precisione, vale a dire "indice di cui non devi preoccuparti troppo". Ma suppongo sia una questione di familiarità. Se avete letto un sacco di Haskell, sarete abituati a leggere mcome monade , fcome funtore , xcome un oggetto , xscome un elenco di xs , e così via.
Jörg W Mittag,

2
Solo un avvertimento davvero enorme. I nomi delle variabili a lettera singola sono OK solo se la lingua ha l'ambito della variabile corretto. Chiederai ovviamente "In quale lingua non è presente l'ambito corretto?". Bene, mi ci sono volute tre ore per capire che JavaScript non ha l'ambito delle variabili in un ciclo FOR. Provalo con un ciclo for all'interno di un ciclo for usando lo stesso nome di variabile. Ti lascerà a bocca aperta.
Nelson,

@Nelson: questa domanda e questa risposta riguardano Java. Ovviamente lingue diverse possono avere considerazioni in qualche modo diverse. (JavaScript non è la stessa lingua di Java.)
ruakh

Sono tutti per nomi di variabili a lettera singola ogni volta che hanno più senso, ma non sono d'accordo che isia "il nome migliore che potresti usare" per un ciclo che utilizza una variabile solo per il conteggio. In tal caso, preferirei vedere countusato come il nome della variabile: immediatamente comprensibile. for (int count = 0; count < 10; count++)o while (count--).
Todd Lehman,

4

Leggendo il codice nella risposta di Kilian, non penso "c'è un ciclo, e c'è una variabile, ha tipo int, ha un nome, e il nome è i, ed è inizializzato su 0,. .. ". Penso solo a "loop ..." in cui i tre punti rappresentano dettagli non importanti a cui non penso nemmeno. Nella mia mente del programmatore, quella variabile non esiste davvero, è solo un artefatto che devo digitare, come for (;;) {} che lo rende un ciclo.

Dal momento che quella variabile non esiste nemmeno nella mia mente, perché dovrei darle un nome, oltre ciò che è assolutamente necessario?


Dovrei aggiungere che in quel tipo di costrutto, sono spesso tentato di usare nemmeno i, ma _per la variabile ovviamente insignificante. Ma non tutti hanno familiarità con Prolog e probabilmente creerebbe più attenzione di quanto non rimuova.
Kilian Foth,

Devi anche considerare come viene utilizzata la variabile all'interno del ciclo, non solo for (...)nell'intestazione.

@KilianFoth: è usato anche in questo modo in Haskell, ML, F # e Scala, credo. E in Ruby, anche se _è un identificatore legale come qualsiasi altro, c'è stato un recente cambiamento nel fatto che le variabili locali inutilizzate denominate _(o che iniziano con _) non generano un avviso di "variabile locale inutilizzata", sebbene Ruby normalmente li avverta.
Jörg W Mittag,

-1

Se ti riferisci alle lettere i, j, k come indici all'interno di un ciclo, questa è una pratica comune in Java e in altri linguaggi di programmazione. Anche se probabilmente è meglio usare un per ogni ciclo di stile, come ad esempio

for(User user: users) {
  doSomethingWithTheUser(user);
}

invece di

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

In Java quello stile di looping è stato introdotto solo di recente. Questo potrebbe essere il motivo per cui lo noti di più per Java, poiché il looping sugli indici era il modo più comune per eseguire il loop su un array o un elenco.

Vi sono alcuni altri casi in cui le singole lettere possono essere appropriate, come ad esempio quando si implementa una funzione matematica in cui singole lettere come n, x o y, possono già essere comuni. Ma in generale, no, dai un nome alle tue variabili in modo significativo.


5
"In Java quello stile di looping è stato introdotto abbastanza di recente" ... come in, un decennio fa? ( Java 5 è stato rilasciato nel 2004 )
meriton

1
Sì, è abbastanza recente. No, non sono vecchio. Sta 'zitto. Maledetti ragazzi, scendi dal mio prato. Esistono ancora molte applicazioni Java legacy disponibili prima di Java 5. E ancora più programmatori Java che hanno imparato la lingua su Java 1.4 e si rifiutano di aggiornare il loro modo di fare. Eppure ancora più esempi di codice online risalgono ai primi anni 2000 (sì, allora avevamo Internet; l'avevamo appena chiamato Web 2.0).
Nick,
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.