it-swarm.it

"If (0 == value) ..." non fa più male che bene?

Questa è una delle cose che odio di più quando la vedo nel codice di qualcun altro. So cosa significa e perché alcune persone lo fanno in questo modo ("e se invece inserissi accidentalmente '=' invece?"). Per me è molto simile a quando un bambino scende le scale contando i passi ad alta voce.

Ad ogni modo, ecco i miei argomenti contrari:

  • Interrompe il flusso naturale di lettura del codice del programma. Noi umani diciamo "se il valore è zero" e non "se zero è valore".
  • I compilatori moderni ti avvertono quando hai un incarico nella tua condizione, o in realtà se la tua condizione è costituita solo da quell'incarico, che, sì, sembra comunque sospetto
  • Non dimenticare di mettere il doppio '=' quando confronti i valori se sei un programmatore. Potresti anche dimenticare di mettere "!" quando si verifica la non uguaglianza.
50
mojuba

Ah, sì, "Yoda conditionals" ("Se il valore è zero, eseguire questo codice è necessario!"). Indico sempre chiunque affermi di essere "migliore" con strumenti come lint (1). Questo particolare problema è stato risolto dalla fine degli anni '70. La maggior parte dei linguaggi moderni non compilerà nemmeno un'espressione come if(x = 10), poiché rifiuta di forzare il risultato dell'assegnazione a un valore booleano.

Come altri hanno già detto, certamente non è un problema, ma provoca un po 'di dissonanza cognitiva.

59
TMN

È odioso perché impone una tassa mentale piccola, ma evidente.

Le persone leggono da sinistra a destra praticamente in tutti i linguaggi di programmazione (e nella maggior parte dei linguaggi naturali).

Se vedo 123 == x, Il modo in cui analizzo mentalmente è:

  • 123 - e allora? informazioni incomplete.
  • == - beh, 123 è 123, perché provarlo ...
  • x - ok, questo è ciò di cui siamo preoccupati. Solo ora ho il contesto.
  • Torna a riconsiderare 123 E perché x viene confrontato con esso.

Quando vedo x == 123 L'analisi mentale è:

  • x - Fornisce il contesto, so qual è la condizione. Potrei scegliere di ignorare il resto. Sulla base del flusso precedente ho una buona idea del perché e di ciò che verrà (e sarei sorpreso se è diverso).
  • == - L'ho pensato.
  • 123 - Sì.

L'interruzione è piccola (in un semplice esempio), ma io sempre lo noto.

Indicare prima il valore può essere una buona idea se vuoi per attirare l'attenzione su di esso, ad es. if (LAUNCH_NUKES == cmd). Normalmente questa non è l'intenzione.

56
dbkk

Dannoso? No. Funziona in entrambi i modi.

Cattiva pratica? Discutibile, nella migliore delle ipotesi. È una semplice programmazione difensiva.

Vale la pena perdere il sonno? Nah.

47
Wonko the Sane

Questo è fondamentalmente flaimbait.

No, non fa più male che bene. Semplice.

Più parole?

Argomento del compilatore? Ehm, ish, forse - non riporre troppa fiducia nel complier per salvarti da te stesso.

"Non dovresti dimenticare" - beh duh - ovviamente non dovresti nel frattempo sono stanco, ho programmato tutto il giorno ho dovuto usare due lingue diverse e a volte, solo a volte, essendo umano, commetto un errore.

Il punto di questo tipo di comportamento è che è difensivo, non è lì perché ti aspetti di sbagliare più di quanto hai un'assicurazione perché ti aspetti di schiantarti ... ma se lo fai è bello essere coperto.

Difficile da leggere? Ti stai lamentando che un programmatore decente dovrebbe avere == cablato (il che rende tutti i tipi di ipotesi scadenti) ma che lo stesso programmatore decente non può leggere 0 == valore ??

Non fa male, ha potenziali benefici, domanda stupida, lascia che gli altri lo facciano se lo desiderano e vanno avanti.

17
Murph

Non lo definirei dannoso, ma è odioso. Quindi no, non direi di si.

11
whatsisname

Non ho mai pensato che l'intero "e se dimenticassi un =?" mai avuto davvero molto peso. Sì, potresti fare un refuso, ma tutti facciamo errori di battitura, sembra sciocco cambiare l'intero stile di codifica perché hai paura di sbagliare. Perché non rendere tutte le variabili e le funzioni tutte minuscole senza punteggiatura, perché un giorno potresti dimenticare di capitalizzare qualcosa o dimenticare un carattere di sottolineatura?

10
GSto

Alcune persone lo usano per chiarire esattamente cosa sta facendo un condizionale. Per esempio:

Modo 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Modo 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Alcune persone ritengono che il secondo esempio sia più conciso, o invertendo gli argomenti illustra il punto di un test (condizionale) prima del test stesso.

In tutta realtà, non mi dispiace davvero in entrambi i casi. Ho i miei cuccioli di pet riguardo allo stile e il più grande è l'incoerenza. Quindi, fallo allo stesso modo, in modo coerente e non mi dispiacerà leggere il tuo codice.

Mescolalo fino al punto in cui sembra che sei diverse persone con il loro stile distintivo ci abbiano lavorato contemporaneamente, mi annoio un po '.

9
Tim Post

Per me è un condizionamento semplice. Come qualcuno che ha imparato (negli anni '90) il C e il C++, mi sono abituato e lo uso ancora, anche se le ragioni sono state insegnate.

Una volta che sei "condizionato" a cercare la "costante" sul lato sinistro, diventa una seconda natura.

Lo uso anche solo per equivalenza (o equivalenza negata), non per maggiore/minore di.

Sono completamente d'accordo con la risposta di Wonko.

6
DevSolo

L'unico caso in cui lo trovo utile è dove la parte variabile dell'if è piuttosto lunga e vedere i valori rende il codice più facile da leggere. Le lingue punteggiate dello spazio dei nomi ne hanno i migliori esempi.

Ad esempio, qualcosa su cui ho lavorato con Single Sign-On ha avuto una situazione in cui si potevano avere due sessioni simultanee se si fosse verificato un certo tipo di errore ed è stato ripristinato in un certo modo, quindi devo aggiungere un gestore per esso che si trovava all'interno di un if che sembrava qualcosa come questo:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

Certamente in questo esempio ci sono altri modi per farlo, ma questo sarebbe un caso in cui la versione numero primo è potenzialmente più leggibile.

5
Bill

Eppure si verificano errori. E a volte vuoi un incarico in un operatore di loop in cui potresti altrimenti controllare l'uguaglianza, o almeno è pratica standard usarlo.

Lo sostengo in qualche modo. Il consiglio che ho seguito (possibilmente da Codice completo) è di mantenere nei confronti quello che dovrebbe essere il valore più basso a sinistra. Ne avevo discusso con un collega prima e pensava che fosse un po 'folle, ma mi sono abituato molto.

Quindi direi:

if ( 0 <= value )

Ma direi anche:

if ( value <= 100 )

Uguaglianza tenderò a verificare con la variabile a sinistra, tuttavia è solo più leggibile.

3
glenatron