2009-03-11 19 views
70

Considerate i seguenti due frammenti, con bretelle:Casi switch Java: con o senza parentesi?

switch (var) { 
    case FOO: { 
    x = x + 1; 
    break; 
    } 

    case BAR: { 
    y = y + 1; 
    break; 
    } 
} 

Senza bretelle:

switch (var) { 
    case FOO: 
    x = x + 1; 
    break; 

    case BAR: 
    y = y + 1; 
    break; 
} 

So che, nel frammento con bretelle, un nuovo ambito viene creato racchiudendo ogni caso in parentesi. Tuttavia, se per ogni caso non è necessario il nuovo ambito (ovvero non viene riutilizzato alcun nome di variabile), esiste un qualche tipo di penalità di prestazioni per l'utilizzo delle parentesi graffe con un caso?

risposta

78

C'è qualche tipo di penalità di prestazioni per l'utilizzo delle parentesi graffe con un caso?

Nessuno.

Le parentesi graffe servono per aiutare il compilatore a capire l'ambito di una variabile, condizione, dichiarazione di funzione, ecc. Non influisce sulle prestazioni di runtime una volta che il codice è stato compilato in un eseguibile.

5

Questa domanda probabilmente verrà chiusa come "argomentativa" (BRACE WAR!) Ma che diamine. In realtà mi piacciono le parentesi graffe dopo i casi. A mio avviso, la sintassi del brutto sintomo assomiglia più al resto dei costrutti linguistici. (Non vi è alcuna penalità per l'uso di parentesi graffe in questo "caso")

+0

Immagino che sia una specie di domanda obiettiva ... Ritraggo la cosa polemica –

+0

Preferisco senza le parentesi graffe ... Trovo che le parentesi aggiungano un sacco di rumore non necessario. – cdmckay

+0

Sì, vorrei che fosse più simile a questo: caso (FOO) {x = x + 1} caso (BAR) {y = y + 1} –

5

Si dice che le parentesi possono essere omesse perché nessun nome di variabili viene riutilizzato. Riutilizzando i nomi delle variabili, suppongo che intendi dichiarare una nuova variabile dello stesso tipo.

Le parentesi graffe sono in realtà più utili per garantire che non si rientri per errore riutilizzando la stessa variabile in diversi case s. Oggi non dichiarano alcuna variabile, ma qualcuno le aggiungerà domani e senza le parentesi il codice è soggetto a errori.

21

Questo è un estremo esempio di ottimizzazione prematura. Sarebbe una buona idea preoccuparsi di quale modo è più facile leggere e fare il debug.

+82

Oppure ... forse ero solo curioso? – cdmckay

+14

concordato. L'unico modo per sapere se l'ottimizzazione potrebbe essere prematura o meno è di porre questo tipo di domande. –

+13

Yer, non intendevo essere uno spasso per te.Ma cerco sempre di ricordare a me stesso che la leggibilità è l'aspetto più importante del codice. – Travis

16

Nessuna penale prestazioni dal punto di vista dell'esecuzione.

penalizzazione delle prestazioni Leggera da un punto di vista compilazione in quanto v'è di più per analizzare, ma se qualcuno fosse in realtà che preoccupa è che avrebbe dovuto scrivere il loro codice di tutto su una riga :-)

E ora la parte parere del nostro post ... ho sempre messo in {} e perché non v'è una sanzione per manutenibilità nel senso che si dovrà probabilmente per metterli in in un secondo momento, e può essere un dolore metterli in un secondo momento. .. ma questa è una preferenza personale del 103%.

+2

+1 per il dolore pensato – Travis

+0

Sono un po 'curioso dal momento che non riesco a vedere la risposta da solo ... @TofuBeer, quando devi aggiungere le parentesi graffe? Inoltre, sono totalmente d'accordo con il punto di manutenibilità, ma non vedo il problema della manutenibilità ATM. EDIT: non importa. Ho appena letto il resto delle risposte qui sotto. – nyaray

+0

In alcuni casi lo fai in C++, quindi se lavori in entrambe le lingue non è una cattiva abitudine entrare. – TofuBeer

8

Con bretelle.

Ci sono così tante cose che possono andare male con istruzioni switch cerco di evitarli dove posso, cioè

  1. Forgetting pause e che hanno quindi caso di caduta-through
  2. dimenticare un caso di default e, quindi, non prendere un non-soddisfatti condizione
  3. accidentalmente riutilizzo variabili tra istruzioni case, o peggio ancora, che colpisce una variabile che è la condivisione di una variabile tra le istruzioni case.

Utilizzando le parentesi graffe è un modo per evitare che sia la condivisione intenzionale e accidentale di variabili tra casi di dichiarazioni

+6

Includere i punti 1 e 2 era fuorviante per questa domanda (per me); la tua linea di chiusura dovrebbe dire esplicitamente che le parentesi risolve solo 3 - ho pensato che intendevi che le parentesi escludevano la necessità di interruzioni, quindi l'ho provata. – ataulm

+0

Il punto 3 non ha nemmeno senso. Non è possibile riutilizzare le variabili a meno che non siano state dichiarate nell'ambito genitore dell'istruzione switch. Ciò significa che se dichiari una variabile all'interno di un caso, non può essere utilizzata in un'altra dichiarazione del caso. Se dichiari una variabile sopra l'istruzione switch (nell'ambito genitore), non importa se usi le parentesi o meno, le istruzioni case avranno accesso alla variabile. – dsingleton

1

ho mai pensato prima. Non ho mai avuto bisogno delle parentesi graffe in una clausola, quindi non vedo davvero perché ne avresti bisogno. Personalmente non scelgo l'idea "Sarà più facile da mantenere", è solo spazzatura, sarà più facile mantenere se il codice ha senso ed è documentato.

No bretelle ... meno sintassi è più

+0

anche le {e} fanno risaltare le cose, il che rende più facile la lettura (IMO). – TofuBeer

+1

ognuno ha un'opinione –

+0

sì. Stavo per condividere una storia di un metodo che ho dovuto modificare (mi ci sono voluti circa 4 ore per aggiungere una riga di codice) ma il codice era folle (circa 10 pagine e largo 4 pagine quando stampato) quindi non è il caso tipico. Ma se avesse usato {} allora ci sarebbe voluto un minuto per aggiungerlo. – TofuBeer

3

Non vorrei usare le parentesi per i casi di commutazione.

  • L'istruzione switch sembra già abbastanza barocca senza parentesi graffe.

  • I casi di interruttori devono essere molto brevi. Quando hai bisogno di dichiarare variabili è un segno che stai sbagliando.

ora fuori per mantenere un po 'di codice C legacy che sport passano casi di oltre 500 linee ...

12

Come sappiamo parentesi graffe per i casi di commutazione non sono necessari. L'utilizzo di casi di bretelle può causare confusione sull'ambito di un caso.

Una parentesi aperta è generalmente associata a qualcosa di significativo come un inizio di una funzione o avviare un ciclo o dall'inizio dichiarazione di classe o dall'inizio matrice inizializzazione ecc ... Sappiamo che, un caso scoppia di blocco interruttore quando incontra una dichiarazione di rottura. Quindi l'uso di parentesi graffe sembra implicare l'idea di un diverso campo di applicazione per un lettore ignorante. Quindi, è meglio evitare l'uso di parentesi graffe per una migliore leggibilità della programmazione.

vale a dire quando ho qualcosa di simile,

switch(i) 
{ 
    case 1 : 
    { 
    //do something 
    } 
    System.out.println("Hello from 1"); 

    case 2: 
    .... 
} 

"Ciao da 1" viene stampato. Ma l'uso di parentesi graffa può suggerire a un lettore ignorante che il caso termina con "}", già sapendo quali parentesi graffe generalmente significano in caso di loop, metodi, ecc.

Come se avessimo istruzioni "jump-to-label" in "C" 'il controllo passa al caso e continua la sua esecuzione. Quindi, con questa comprensione, è solo una pratica CATTIVA utilizzare le parentesi graffe durante la scrittura di casi per switch.

Tecnicamente parlando è possibile circondare qualsiasi blocco del codice con una coppia aggiuntiva di parentesi graffe quando viene utilizzato con una sintassi valida. Usare le parentesi graffe in switch sembra così male almeno per me in quanto sembra dare una sensazione diversa come ho detto sopra.

Il mio suggerimento: Basta evitare di utilizzare le parentesi graffe circostanti per i casi di interruttore.

+0

in disaccordo con questo. Usare le parentesi graffe e scrivere codice al di fuori delle parentesi graffe sarebbe una pessima forma, sì, ma questo non scredita l'uso di parentesi graffe in sé. – caseif