Custodie per switch Java: con o senza parentesi graffe?


85

Considera i seguenti due frammenti, con parentesi graffe:

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

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

Senza parentesi graffe:

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

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

So che, nello snippet con le parentesi graffe, viene creato un nuovo ambito racchiudendo ogni caso tra parentesi graffe. Tuttavia, se ogni caso non necessita del nuovo ambito (cioè non vengono riutilizzati nomi di variabili), c'è qualche tipo di penalizzazione delle prestazioni per l'utilizzo delle parentesi graffe con un caso?

Risposte:


99

c'è qualche tipo di penalizzazione delle prestazioni per l'utilizzo delle parentesi graffe con una custodia?

Nessuna.

Le parentesi graffe sono lì 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.


21

Nessuna penalità di prestazione dal punto di vista dell'esecuzione.

Leggera penalizzazione delle prestazioni dal punto di vista della compilazione in quanto c'è molto di più da analizzare, ma se qualcuno fosse davvero così preoccupato dovrebbe scrivere il proprio codice tutto su una riga :-)

E ora per la parte di opinione del nostro post ... ho sempre inserito {e} perché c'è una penalità per la manutenibilità in quanto probabilmente dovrai inserirli in un secondo momento, e può essere un dolore metterli in seguito ... ma questa è una preferenza personale del 103%.


Sono un po 'curioso visto 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à, semplicemente non vedo il problema di manutenibilità ATM. EDIT: non importa. Ho appena letto il resto delle risposte di seguito.
nyaray

Lo fai in C ++ in alcuni casi, quindi se lavori in entrambi i linguaggi non è una cattiva abitudine entrare in nessuno dei due.
TofuBeer

13

Come sappiamo le parentesi graffe per i casi degli interruttori non sono necessarie. L'uso di casi di parentesi graffe può causare una confusione sull'ambito di un caso.

Una parentesi graffa di apertura è generalmente associata a qualcosa di significativo come l'inizio di una funzione o l'inizio di un ciclo o l'inizio della dichiarazione di classe o l'inizio dell'inizializzazione dell'array, ecc ... Sappiamo che un caso si interrompe dal blocco switch quando incontra un'interruzione dichiarazione. Quindi l'uso delle parentesi graffe sembra implicare l'idea di un diverso ambito di applicazione per un lettore ignorante. Quindi, è meglio evitare di usare le parentesi graffe per una migliore leggibilità della programmazione.

cioè quando ho qualcosa come

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

  case 2: 
  ....
}

"Hello from 1" viene stampato. Ma l'uso della parentesi graffa può suggerire a un lettore ignorante che il caso finisce con '}', sapendo già cosa significano generalmente le parentesi graffe in caso di cicli, metodi ecc.

Come se avessimo istruzioni jump-to-label in "C", il controllo si sposta semplicemente su case e continua la sua esecuzione. Quindi, con questa comprensione è solo una cattiva pratica usare le parentesi graffe quando si scrivono casi per switch.

Tecnicamente parlando puoi racchiudere qualsiasi blocco del tuo codice con una coppia aggiuntiva di parentesi graffe se usato con una sintassi valida. L'uso delle parentesi graffe nell'interruttore sembra così brutto almeno per me in quanto sembra dare una sensazione diversa come ho detto sopra.

Il mio consiglio: evita semplicemente di usare le parentesi graffe circostanti per i casi di switch.


5
Non sono d'accordo 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 delle parentesi graffe in sé.
Max Roncace

12

Con le parentesi graffe.

Ci sono così tante cose che possono andare storte con le istruzioni switch che cerco di evitarle dove posso, ad es

  1. Dimenticare le pause e quindi avere casi di fallimenti
  2. Dimenticare un caso predefinito e quindi non cogliere una condizione non soddisfatta
  3. Riutilizzare accidentalmente variabili tra istruzioni case o, peggio ancora, influenzare una variabile che condivide una variabile tra istruzioni case.

L'uso delle parentesi graffe è un modo per prevenire la condivisione intenzionale e accidentale di variabili tra le istruzioni case


8
Includere i punti 1 e 2 è stato fuorviante per questa domanda (per me); la tua riga di chiusura dovrebbe dire esplicitamente che le parentesi graffe risolvono solo 3 - Pensavo volessi dire che le parentesi graffe precludevano la necessità di pause, quindi l'ho provato.
ataulm

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

Ho appena (ri) scoperto che le variabili dichiarate nel caso 1 possono ancora essere nell'ambito del caso 2. Ad esempio: ...case 1: int a = 10; break; case 2: int a = 11; break; ...non si compila. (testato con Oracle JDK 8)
anuragw

5

Questa domanda probabilmente verrà chiusa come "polemica" (BRACE WAR!) Ma che diamine. In realtà mi piacciono le parentesi graffe dopo i casi. Per me fa sembrare la brutta sintassi dello switch più simile al resto dei costrutti del linguaggio. (Non ci sono penalità per l'uso delle parentesi graffe in questo "caso")


Immagino sia una specie di domanda oggettiva ... Ritiro la cosa argomentativa
Andy White,

Lo preferisco senza le parentesi graffe ... Trovo che le parentesi graffe aggiungano molto rumore non necessario.
cdmckay

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

Spazio vuoto sensibile == bello. Bretelle non necessarie == succhiare.
Shog9

3
spazio bianco == mix di tabulazioni e spazi == suck (ho solo pensato di inserire un commento di tabulazione contro spazio nel mix)
Andy White

5

Dici che le parentesi graffe possono essere omesse perché nessun nome di variabile viene riutilizzato. Riutilizzando i nomi delle variabili, presumo che tu intenda dichiarare una nuova variabile dello stesso tipo.

Le parentesi graffe sono in realtà più utili per assicurarti di non riutilizzare caseper errore la stessa variabile in messaggi diversi . Oggi non dichiarano alcuna variabile, ma qualcuno le aggiungerà domani e senza le parentesi graffe il codice è soggetto a errori.


3

Non userei le parentesi graffe per cambiare i casi.

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

  • I casi di cambio dovrebbero essere molto brevi. Quando hai bisogno di dichiarare variabili, è segno che lo stai facendo male.

Ora passiamo al mantenimento del codice C legacy che cambia i casi di oltre 500 linee ...


1

Non ci avevo mai pensato prima. Non ho mai avuto bisogno delle parentesi graffe in una clausola case, quindi non riesco davvero a capire perché avresti bisogno di loro. Personalmente non vado per l'idea "Sarà più facile mantenere", è solo spazzatura, sarà più facile da mantenere se il codice ha senso ed è documentato.

Niente parentesi graffe ... meno sintassi è più


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

Sì. Stavo per condividere la storia di un metodo che una volta ho dovuto modificare (mi ci sono volute circa 4 ore per aggiungere una riga di codice) ma il codice era folle (circa 10 pagine di lunghezza e 4 pagine di larghezza una volta stampato) quindi non lo è il caso tipico. Ma se avesse usato {}, sarebbe stato necessario un minuto per aggiungerlo.
TofuBeer

Penso che il punto sia qui che se il programmatore originale avesse fatto lo sforzo di inserire {} blocchi in modo che il codice fosse più leggibile, avrebbero potuto effettivamente preoccuparsi che stessero scrivendo un'istruzione di cambio di 10 pagine e cambiato il codice in un un po 'meno folle
Gareth Davis

swtich sarebbe stato un sogno .. fosse annidato se / elses ... scritto in codice C ++ da programmatori COBOL ... Ho lasciato non molto tempo dopo.
TofuBeer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.