Convenzione Java per se / else se l'ordine

6

Ho una struttura if / else if che in alcuni casi non fa nulla. Dal codice che ho visto nella mia carriera, il caso "vuoto" è normalmente lasciato fuori. Ma quando ho scritto il mio codice, non mi sembra giusto lasciare questo caso, ma mostrarlo come un caso reale che semplicemente non fa nulla. Ad esempio, in un caso in cui qualcosa viene fatto quando un numero è inferiore a 5 e superiore a 10, ma in mezzo non viene fatto nulla:

int a = 4
if(a < 5) {
  do something
} else if(a >=5 && a <= 10) {
  // do nothing
} else if(a > 10) {
  do something else
}

Il motivo per cui ho pensato che fosse un'opzione migliore è perché:

  1. È così che penso al problema nella mia mente.
  2. Questo mostra al lettore del codice che ho pensato a tutte le possibilità e non l'ho dimenticato per errore.

Quindi mi chiedevo se questa convenzione fosse accettata dalla comunità di programmazione o se fosse evitata.

    
posta vainolo 04.10.2013 - 10:44
fonte

2 risposte

10

Non stai semplicemente controllando il valore di a per il gusto di farlo. Probabilmente significa qualcosa.

Quindi preferirei vedere:

Boolean sell = a < 5;
Boolean buy = a > 10;
Boolean error = a >= 5 & a <= 10;
// or even: 
Boolean error = !sell & !buy;
/* ^ (that's single source principle: if 5 changes to 6 one day, 
 * you don't have to remember to change it in two places) */

E poi:

if (sell) {

} else if (buy) {

} else if (error) {

}

Non è più chiaro?

Inoltre, a potrebbe essere entrambi inferiore a 5 e maggiore di 10 ??

Al contrario, quelli else s sono chiaramente ridondanti. ( Salvo modifichi il valore di a in uno dei tuoi blocchi if , attenzione, se valuti solo a una volta, tuttavia, come nel mio esempio, non hai preoccuparsi di questo).

Quindi:

Boolean sell = a < 5;
Boolean buy = a > 10;
Boolean error = !sell & !buy;

if (sell) {

} 
if (buy) {

} 
if (error) {
    // handle error
}

Questo è molto più chiaro e flessibile a mio parere - se alcune condizioni non si escludono a vicenda, come può accadere, non è necessario fare molto del refactoring.

    
risposta data 04.10.2013 - 12:56
fonte
11

Eviterei di definire il caso non fare nulla dando l'intervall. Vorrei usare un else -branch per quello

int a = 4
if(a < 5) {
  do something
} else if(a > 10) {
  do something else
} else {
     //This should mean: (a >=5 && a <= 10)
     // do nothing

     // Maybe log something here 
     // or even add an assertion while development to ensure that the 
     // branch is only reached in expected cases:
     assert (a >=5 && a <= 10) : "I expected 'a' to be 5<=a<=10, but a is:"+a;
}
    
risposta data 04.10.2013 - 10:51
fonte

Leggi altre domande sui tag