Come dovrei scrivere le mie dichiarazioni if? [duplicare]

1

Quando ero un giovane padawan nel mondo della programmazione, una persona che consideravo un mentore mi ha detto che se le dichiarazioni sono più esteticamente gradevoli se scritte nel modo seguente:

if (condition == false) {
    doSomething()
}

o

if (condition == true) {
    doSomething()
}

Personalmente ho scoperto che nel primo caso è vero, o almeno è più facile da leggere di

if (!condition) {
    doSomething()
}

Nel caso "vero", probabilmente è un eccesso.
Quindi lo uso solo quando voglio testare la condizione per il caso "falso".

Quasi tutti i miei attuali colleghi mi dicono che in questo modo è assolutamente sbagliato.

La scrittura delle istruzioni if ha un problema di prestazioni? Sto sprecando millisecondi su ogni valutazione facendolo così?
Sonar li segnala come troppo complessi

Puoi convincermi a non farlo più? ... o che è giusto farlo in quel modo?

    
posta juan 15.12.2011 - 14:57
fonte

4 risposte

6

Utilizza ciò che è più leggibile.

Nella nostra azienda, è consuetudine scegliere

if (isReportOpen()) {
    doSomething();
}

ma

if (int.TryParse(a, b) == true) {
    doSomething();
}

Nel primo caso, è ovvio che la chiamata al metodo isReportOpen() sia usata come condizione booleana, quindi la userò così com'è. Legge anche fluentemente: se [il] rapporto è aperto, [quindi] fai qualcosa.

Nel secondo caso, non è affatto ovvio che il metodo restituisca un valore booleano che indica il successo o l'insuccesso. Pertanto, si legge: se si tenta di analizzare a come un intero restituito true, [then] fare qualcosa.

    
risposta data 15.12.2011 - 15:15
fonte
2
if (condition == true) {
    doSomething();
}

Questo è semplicemente sbagliato. Stai violando DRY. Vuoi sapere se è vero, quindi ricontrollalo di nuovo in if . Chiunque non riesca a comprendere il == true dell'istruzione if deve tornare a scuola. Lo stesso vale per l'altro esempio.

Per questo motivo, sono anche più difficili da leggere. Quando leggo affermazioni del genere, perdo la fiducia nel programmatore che l'ha scritto e lo aggiungo a un elenco di potenziali bug. Non capisce il concetto di if ? È un errore che la condizione sia così? Devo smettere e capire questa intera funzione per cercare di capire se questo è effettivamente corretto? Cos'altro c'è in agguato qui?

Inoltre, in alcune lingue, questo è un bug in sé stesso. Immagina, in C ++ 11,

std::unique_ptr<int> i;
if (i) // valid

if (i == true) // not valid

In C ++ 11, le istruzioni linguistiche che si aspettano espressioni booleane sono una conversione esplicita a bool, che può richiamare quelle usate in es. puntatori intelligenti, ma il tuo confronto con true non lo farà. Fortunatamente, il compilatore ti sculaccerà, ma è ancora un bug.

Non è affatto necessario richiamare le costanti booleane in tali dichiarazioni.

    
risposta data 15.12.2011 - 15:11
fonte
1

Usando == , stai sovvertendo il significato di if : se la condizione è vera, continua; se è falso, fai il caso else , se esiste. if (x == true) dice "se è vero che x è vero" e if (x == false) dice "se è vero che x è falso". Questo non è solo ridondante, ma diventa rapidamente fuorviante.

Ti sfido a dirmelo a colpo d'occhio: cosa significa if (!(notDone != false)) ? "Se non è vero che notDone non è falso"? Perché dire qualcosa di così complicato quando if (!done) ("se non fatto") è sufficiente?

Semplifica, semplifica.

    
risposta data 15.12.2011 - 15:13
fonte
0

Problemi di prestazioni? No.

Personalmente preferisco

if (!condition) 

E

  if (condition)

Mi piace che le mie istruzioni If siano SEMPRE risolte su true.

Per esempio non vorrei mai qualcosa di simile: (non so nemmeno se questa è una sintassi valida) ( Sembra molto complessa, non è vero? )

if ((a==b)==False) 

Vorrei fare:

 if (!(a==b)) 

o probabile

 if (a<>b)
    
risposta data 15.12.2011 - 15:10
fonte

Leggi altre domande sui tag