If-statement, organizza per condizionale o effetto

1

Un altro codice inviato da un collega per un PR l'altro giorno, che segue effettivamente questo flusso:

if (a)
  do something_a
else if (b)
  do something_b
else if (c)
  do something_a

dove a , b e c sono condizioni mutuamente esclusive (in realtà, stanno tutti controllando se una variabile è uguale a valori diversi).

Nella mia esperienza tuttavia, ho sempre cercato di comprimere i condizionali che hanno gli stessi risultati con gli OR, come il seguente.

if (a OR c)
  do something_a
else if (b)
  do something_b

Ignorare le prestazioni , quale versione è migliore? Quale versione è più facile da mantenere in futuro?

    
posta JRJurman 25.07.2017 - 07:51
fonte

3 risposte

9

Almeno poiché la domanda è stata inizialmente posta, i due non sono equivalenti.

Nel primo, something_a viene eseguito solo se a è vero o se b è falso e c è vero. I.e, if (a || (c && !b)) .

Nel secondo, something_a viene eseguito se a o c è true (indipendentemente da b ). Solo se questi sono entrambi falsi consideriamo b .

Pertanto, la prima domanda non dovrebbe essere più facile da mantenere, ma quale comportamento si desidera effettivamente.

Se le condizioni sono esclusive, in modo tale che la differenza non si presenti, allora considererei la relazione tra le condizioni, se ce ne sono. Se è fondamentalmente una coincidenza che due input producano lo stesso output, allora probabilmente li elenco ogni individuo, poiché è probabilmente più semplice mappare semplicemente dagli input ai risultati quando ciascuno è elencato direttamente. Il secondo diventa interessante soprattutto quando / se c'è una relazione abbastanza ovvia tra le condizioni.

Ad esempio, se hai qualcosa di simile:

if (customer has no ID || customer's age < minimum)
    reject order for alcoholic beverage

In questo caso, abbiamo due diverse manifestazioni di ciò che è davvero una singola condizione: il cliente non può dimostrare di essere abbastanza vecchio da comprare la bevanda. Non sono (dal nostro punto di vista) due condizioni non correlate che portano allo stesso risultato - piuttosto, sono solo modi diversi di esprimere la stessa condizione, quindi ha più senso raggrupparle insieme.

    
risposta data 25.07.2017 - 08:05
fonte
1

La duplicazione è negativa, quindi la prima versione è inferiore.

Quanto peggio dipende da quanta roba è effettivamente do_stuff_a() ; se è davvero solo una riga, non è un grosso problema, ma i gruppi ripetuti di istruzioni dovrebbero generalmente essere combinati o refactored in un metodo.

    
risposta data 25.07.2017 - 09:29
fonte
-1

Né è "migliore" il suo stile di codifica.

(Ignorando entrambe le prestazioni e se hanno lo stesso risultato !!!!!)

    
risposta data 25.07.2017 - 09:11
fonte

Leggi altre domande sui tag