Casos de interruptores Java: ¿con o sin llaves?

85

Considere los siguientes dos fragmentos, con llaves:

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

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

Sin tirantes:

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

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

Sé que, en el fragmento con llaves, se crea un nuevo alcance al encerrar cada caso entre llaves. Sin embargo, si cada caso no necesita el nuevo alcance (es decir, no se reutilizan los nombres de las variables), ¿existe algún tipo de penalización de rendimiento por usar las llaves con un caso?

cdmckay
fuente

Respuestas:

99

¿Existe algún tipo de penalización en el rendimiento por usar las llaves con un estuche?

Ninguna.

Las llaves están ahí para ayudar al compilador a determinar el alcance de una variable, condición, declaración de función, etc. No afecta el rendimiento en tiempo de ejecución una vez que el código se compila en un ejecutable.

MrValdez
fuente
21

Sin penalización de desempeño desde el punto de vista de la ejecución.

Ligera penalización en el rendimiento desde el punto de vista de la compilación, ya que hay más para analizar, pero si alguien estuviera realmente tan preocupado por eso, tendría que escribir todo su código en una línea :-)

Y ahora, para la parte de opinión de nuestra publicación ... siempre coloco {y} porque hay una penalización por la capacidad de mantenimiento en el sentido de que probablemente tendrá que colocarlos en una fecha posterior, y puede ser una molestia ponerlos en más tarde ... pero eso es 103% preferencia personal.

Tofu, cerveza
fuente
Tengo un poco de curiosidad ya que no puedo ver la respuesta yo mismo ... @TofuBeer, ¿cuándo TIENES que agregar los frenos? Además, estoy totalmente de acuerdo con el punto de mantenibilidad, simplemente no veo el problema de mantenibilidad ATM. EDITAR: no importa. Acabo de leer el resto de las respuestas a continuación.
nyaray
Lo hace en C ++ en algunos casos, por lo que si trabaja en ambos lenguajes, no es un mal hábito entrar en ninguno.
TofuBeer
13

Como sabemos, los aparatos ortopédicos para las cajas de interruptores no son necesarios. El uso de estuches con frenillos puede causar confusión sobre el alcance de un caso.

Una llave de apertura generalmente se asocia con algo significativo como el comienzo de una función o el comienzo de un bucle o el comienzo de la declaración de clase o el comienzo de la inicialización de la matriz, etc. declaración. Por lo tanto, el uso de llaves parece implicar la idea de un alcance diferente para el caso para un lector ignorante. Por lo tanto, es mejor evitar el uso de llaves en aras de una mejor legibilidad de la programación.

es decir, cuando tengo algo como,

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

  case 2: 
  ....
}

Se imprime "Hola desde 1". Pero el uso de llaves puede sugerir a un lector ignorante que el caso termina con '}', sabiendo ya qué significan las llaves en el caso de bucles, métodos, etc.

Como si tuviéramos declaraciones de salto a etiqueta en 'C', el control simplemente cambia a caso y continúa su ejecución. Entonces, con ese entendimiento, es solo una MALA práctica usar llaves al escribir casos para switch.

Técnicamente hablando, puede rodear cualquier bloque de su código con un par adicional de llaves cuando se usa con una sintaxis válida. El uso de llaves en el interruptor se ve tan mal al menos para mí, ya que parece dar una sensación diferente, como dije anteriormente.

Mi sugerencia: simplemente evite usar tirantes circundantes para las cajas de interruptores.

Real Red.
fuente
5
No estoy de acuerdo con esto. Usar llaves Y escribir código fuera de las llaves sería de muy mala forma, sí, pero esto no desacredita el uso de llaves en sí mismo.
Max Roncace
12

Con tirantes.

Hay tantas cosas que pueden salir mal con las declaraciones de cambio que trato de evitarlas donde puedo, es decir

  1. Olvidar las pausas y, por lo tanto, tener casos fallidos
  2. Olvidar un caso predeterminado y, por lo tanto, no detectar una condición no atendida
  3. Reutilizar accidentalmente variables entre declaraciones de casos, o peor aún, afectar una variable que ESTÁ compartiendo una variable entre declaraciones de casos.

El uso de llaves es una forma de evitar el intercambio intencional y accidental de variables entre declaraciones de casos

jklp
fuente
8
Incluir los puntos 1 y 2 fue engañoso para esta pregunta (para mí); su línea de cierre debe decir explícitamente que los frenos resuelven 3 solamente; pensé que quería decir que los frenos impedían la necesidad de descansos, luego lo intenté.
ataulm
El punto 3 ni siquiera tiene sentido. No puede reutilizar variables a menos que hayan sido declaradas en un ámbito principal de la instrucción switch. Esto significa que si declaras una variable dentro de un caso, no se puede usar en otra declaración de caso. Si declara una variable por encima de la instrucción de cambio (en el ámbito principal), no importa si usa llaves o no, las declaraciones de casos tendrán acceso a la variable.
dsingleton
Acabo de (re) descubrir que las variables declaradas en el caso 1 todavía pueden estar dentro del alcance en el caso 2. Por ejemplo: ...case 1: int a = 10; break; case 2: int a = 11; break; ...no se compila. (probado con Oracle JDK 8)
anuragw
5

Esta pregunta probablemente se cerrará como "argumentativa" (¡BRACE WAR!) Pero qué diablos. De hecho, me gustan los frenillos después de los casos. Para mí, hace que la sintaxis del cambio feo se parezca más al resto de las construcciones del lenguaje. (No hay penalización por usar llaves en este "caso")

Andy White
fuente
Supongo que es una pregunta objetiva ... Me retracto de lo argumentativo
Andy White
Lo prefiero sin los frenillos ... Encuentro que los frenillos añaden mucho ruido innecesario.
cdmckay
Sí, desearía que fuera más así: caso (FOO) {x = x + 1} caso (BAR) {y = y + 1}
Andy White
Espacio en blanco sensible == agradable. Frenillos innecesarios == chupar.
Shog9
3
espacio en blanco == mezcla de pestañas y espacios == suck (solo pensé en lanzar un comentario de tabulación contra espacio en la mezcla)
Andy White
5

Dice que las llaves se pueden omitir porque no se reutilizan nombres de variables. Al reutilizar nombres de variables, supongo que te refieres a declarar una nueva variable del mismo tipo.

Las llaves son en realidad más útiles para garantizar que no termine reutilizando la misma variable en diferentes casecorreos electrónicos por error. No declaran ninguna variable hoy, pero alguien las agregará mañana y, sin las llaves, el código es propenso a errores.

Variable miserable
fuente
3

No usaría llaves para las cajas de interruptores.

  • La declaración del cambio parece bastante barroca ya sin tirantes.

  • Los casos de interruptores deben ser muy cortos. Cuando necesita declarar variables, es una señal de que lo está haciendo mal.

Ahora vamos a mantener un código C heredado que tiene cajas de cambio de más de 500 líneas ...

estrella azul
fuente
1

Nunca lo había pensado antes. Nunca necesité las llaves en una cláusula de caso, así que no puedo ver por qué las necesitarías. Personalmente, no opto por la idea de "Será más fácil de mantener", eso es una tontería, será más fácil de mantener si el código tiene sentido y está documentado.

Sin llaves ... menos sintaxis es más

Gareth Davis
fuente
{y} también hacen que las cosas se destaquen, lo que hace que sea más fácil de leer (IMO).
TofuBeer
Sip. Iba a compartir la historia de un método que una vez tuve que modificar (me tomó alrededor de 4 horas agregar una línea de código) pero el código era una locura (alrededor de 10 páginas de largo y 4 de ancho cuando se imprimió) por lo que no lo es el caso típico. Pero si hubiera usado {}, habría tomado un minuto agregarlo.
TofuBeer
Creo que el punto aquí es que si el programador original se hubiera esforzado en poner {} bloques para que el código fuera más legible, es posible que realmente les hubiera importado escribir una declaración de cambio de 10 páginas y cambiar el código para que fuera un un poco menos loco
Gareth Davis
swtich habría sido un sueño ... estaba anidado si / elses ... escrito en código C ++ por programadores COBOL ... Lo dejé poco después.
TofuBeer