2013-06-13 12 views
5

mio IDE (IntelliJ IDEA) mi sta dicendo che ho la possibilità di rimuovere le parentesi graffe su questo if:È necessario evitare più istruzioni if ​​come "if (condition) if (condition) ..." in Java?

if (objectIsOfTypeFoo) { 
    if (objectOfTypeFooIsShared) { 
     // do something with Object of type Foo knowing that it's shared... 
    } else { 
     // do something with Object of type Foo knowing that it's not shared... 
    } 
} else if (objectIsOfTypeBar) { 
    ... 
} 

Per diventare:

if (objectIsOfTypeFoo) if (objectOfTypeFooIsShared) { 
    // do something with Object of type Foo knowing that it's shared... 
} else { 
    // do something with Object of type Foo knowing that it's not shared... 
} else if (objectIsOfTypeBar) { 
    ... 
} 

Capisco come questo ha un senso, e è allettante perdere il trattino, ma la mia preoccupazione è che la leggibilità possa risentirne. Quest'ultimo aspetto è più pulito, ma lo spazio risparmiato vale la potenziale confusione?

Suppongo che la differenza di prestazioni tra i due sia banale, se non del tutto.

E come domanda successiva: Esiste un limite al numero di "se" (condizione) che è possibile inserire in una singola riga, o piuttosto a che punto è diventato troppo?

+4

Il primo esempio è più leggibile ed è meno probabile che causi problemi a causa di parentesi graffe mancanti - IMHO – MadProgrammer

+2

La differenza di prestazioni in fase di esecuzione è nullo, poiché il codice gen per entrambe le versioni è identico. La differenza di prestazioni al momento della compilazione è il costo di lessare un paio di parentesi graffe aggiuntive. Quindi niente. Oh, e ignori l'IDE: sta offrendo (secondo me) un orribile consiglio. – dlev

+0

Non ho mai visto IntelliJ raccomandare una cosa del genere. Controllerò le tue impostazioni di stile. – duffymo

risposta

8

Sto votando per il modo in cui hai già.

Non so nemmeno usare questo:

if(foo) 
    return bar; 

Mi piace questo posto:

if(foo){ 
    return bar; 
} 

"I programmi devono essere scritte per le persone a leggere, e solo incidentalmente per le macchine da eseguire"

+2

+1 - sì, sì, ma per lo stile E la citazione perfetta. Personalmente, ti consiglierei di accettarlo. – duffymo

+1

Non sono d'accordo, penso che quando un if è facile come se (foo) lanci un'eccezione, non è male. – nachokk

2

Preferirei il primo. Penso che il bit con più if su una singola riga sia illeggibile.

Siamo spiacenti, ma ho intenzione di votare per chiudere. Sarà un dibattito senza risposta.

+1

Cool grazie! Chiudi! Sembra che ci sia già un consenso su questo :) – Liam

4

Utilizzare sempre bretelle. Un giorno, vorrai inserire una seconda affermazione nel tuo blocco if o else, e poi vorresti averlo. Tuttavia, stai davvero facendo i controlli instanceof? Puoi rielaborare il tuo programma per trasformarli invece in un comportamento di oggetti polimorfici?

+1

Spesso quando qualcuno scrive un codice complesso come questo, un ulteriore pensiero può semplificarlo. Anche se non è facile avere diverse versioni di 'Foo', forse' Foo' può contenere un oggetto che conosce la strategia di condivisione o ha diverse sottoclassi con la strategia di condivisione. Ricorda la lettera di Pascal: "Mi scuso per il fatto che la mia lettera è stata così lunga, non ho avuto il tempo di farla breve". –

+0

Sì, ho bisogno di generare la lezione, ma per il momento ho solo bisogno di ottenere quello che ho lavorato! – Liam

1

Si consiglia di utilizzare sempre le parentesi graffe, ma c'è una situazione in cui nessuna parentesi uso del corpo ed è meglio non utilizzarli causa è più leggibile

if(condition){ 

} else if (condition) { 
    ... 
}else if (condition3){ 

} 

se si usa sempre le parentesi sarebbe come questo. Probabilmente sbaglio in qualche posto.

if(condition){ 

} else{ 

     if (condition) { 
      ... 
     }else { 

      if (condition3){ 

      }//end if 
     }//end else 
}//end else 

Quindi penso che l'uso sempre dipende di leggibilità, come sopra detto i programmi devono essere scritte per le persone a leggere e solo incidentalmente per le macchine da eseguire.