2010-09-01 5 views
7

Checkstyle lamenta il seguente:Le parentesi dovrebbero sempre essere posizionate attorno all'operatore ternario?

return (null == a ? a : new A()); 

e dice che le parentesi non sono necessarie.

Mentre l'istruzione funziona certamente bene senza di loro, sembra molto più leggibile con loro presente --- altrimenti come io sto leggendo tendo a vedere:

return null 

prima e poi fare una pausa per considerare il restante

== a ? a : new A(); 

parte, poiché il mio cervello è già andato giù per un percorso.

Inoltre, tendo a fare la stessa cosa ogni volta Vedo un operatore ternario, a meno che non sia raggruppato in paren.

Quindi: i parents attorno al ternario dovrebbero essere lo standard di fatto? C'è qualche ragione per non metterli li?

+0

A me è anche più leggibile con i parens. Ho avuto un esempio come var thing = something.prop1.method2() ....? x: y. Leggendolo mi aspettavo per la prima volta qualcosa. Prop1.method2 sarebbe stata la cosa che inizializzava il mio var. Se ci fossero stati dei parenti ... sarei stato sospettoso di usare un operatore ternario. – user420667

risposta

6

Bene, il checkstyle è giusto, le parentesi sono inutili per l'esecuzione. Ma inutile per l'esecuzione non significa inutile per la buona lettura del tuo codice. Dovresti lasciarli se ha più senso leggere.

penso che questo codice non ha bisogno di ulteriori parentesi:

int number = (myBoolean)? 1 : 2; 

ma nel tuo caso la parola chiave return e il fatto vostro booleana è un'espressione in grado di cambiare il modo di leggere la dichiarazione.

+0

Perché stai mettendo parens intorno a 'myBoolean' nel tuo codice di esempio? Non è lo stesso schema di quello che viene chiesto. –

+3

Hum, è un'abitudine ... E, penso che chiarisca le cose. –

+0

Preferisco anche questa sintassi. Sembra che faciliti la lettura e l'identificazione del condizionale – sarink

1

Entrambe le opzioni sono corrette, utilizza ciò che la tua squadra utilizza o quello che ti piace se lavori da solo.

IIRC Per impostazione predefinita, checkstyle utilizza le linee guida di stile Sun (r.i.p), quindi se si desidera conformarsi allo stile standard, ascoltarlo e rimuovere i paren.

2

No, non dovrebbe essere lo standard di fatto. Lo preferisco senza parens.

Penso che l'unica ragione per metterli lì è forzare l'ordine di valutazione o chiarire una linea confusa.

0

Poiché la base della domanda riguarda l'atto di lettura del codice, affronterò la domanda da quella prospettiva.

Uno dei principi fondamentali dei cosiddetti programmi di formazione "Velocità di lettura" è che si cerca di ottenere il lettore a sviluppare un gestalt della riga di testo, piuttosto che leggerlo in modo sequenziale parola per parola. Potresti provare a prendere una pagina dal loro libro e fare un passo indietro dal tuo codice - letteralmente se necessario - per avere un'idea della linea completa piuttosto che trattare l'atto di leggere come se fosse l'atto di analizzare il token per token.

In alternativa, è possibile utilizzare un editor che consente di configurare gli stili: è possibile rendere l'operatore ternario di un colore diverso in modo che salti fuori. Notepad ++, ad esempio, ha un numero di temi incorporati che lo fanno, così come molti altri editor.

4

Durante la lettura di una dichiarazione di reso, so che tutto tra "ritorno" e ";" è quello che verrà restituito, quindi non c'è modo che io possa leggere il tuo esempio di codice come return null seguito da alcuni simboli come si afferma di leggerlo.

Forse leggere le tecniche di analisi potrebbe aiutarti a vederlo come faccio io. Detto questo, non ho davvero letto le tecniche di analisi, anche se ho messo insieme alcuni parser nel corso degli anni.

Rimuovo sempre le parentesi non necessarie. Non aiutano nella comprensione del codice, poiché conosco piuttosto bene la precedenza degli operatori Java. Nel momento in cui non sono sicuro, aggiungo parentesi e aspetto di vedere se IDEA mi dice che sono ridondanti. Quindi li rimuovo e provo a memorizzare la regola della precedenza che ho appena scoperto.

Nelle codebase che ho ereditato, tendo a trovare il maggior numero di parentesi ridondanti in aree di codice che sono scarse per altri motivi, quindi associo le due.

1

In generale, no.

Le parentesi sono non richieste intorno agli operatori ternari (anche noti come condizionali) o alle sue sezioni, poiché la loro precedenza è molto bassa nell'ordine delle operazioni (appena sotto gli operatori logici e sopra le assegnazioni). Vedi il link sottostante per la tabella completa.

Si potrebbe affermare, quindi, che tali parens inutili visivamente disordine il codice, e rivelano una mancanza di comprensione da parte del programmatore.

eccezioni che potrebbero richiedere l'uso di parentesi all'interno o intorno ternari sarebbero:

  • Se il ternario è abbastanza complessa da meritare più righe; potresti quindi racchiudere la tua frase in parentesi per impedire l'inserimento automatico del punto e virgola.

  • Se il tuo ternario è annidato in un altro ternario.

Vedi anche su MDN: