Pregunta Casos de cambio de Java: con o sin llaves?


Considere los siguientes dos fragmentos, con llaves:

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

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

Sin llaves

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 ámbito (es decir, no se están reutilizando los nombres de las variables), ¿hay algún tipo de penalización de rendimiento por utilizar los refuerzos con un caso?


74
2018-03-11 06:00


origen


Respuestas:


¿Hay algún tipo de penalización de rendimiento por utilizar los frenos con una funda?

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 del tiempo de ejecución una vez que el código se compila en un ejecutable.


80
2018-03-11 06:05



Esto es un extremo ejemplo de optimización prematura. Sería una mejor idea preocuparse acerca de qué manera es más fácil de leer y depurar.


21
2018-03-11 06:20



Sin penalización de rendimiento desde el punto de vista de la ejecución.

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

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


16
2018-03-11 06:24



Como sabemos, las llaves para cajas de interruptores no son necesarias. El uso de brackets puede causar confusión sobre el alcance de un caso.

Una abrazadera de apertura generalmente se asocia con algo significativo como el inicio de una función o el inicio de un bucle o el inicio de la declaración de clase o el inicio de la inicialización de la matriz, etc. Sabemos que un caso sale del bloque de interruptor cuando se encuentra con un corte declaración. Por lo tanto, el uso de llaves parece implicar la idea de un alcance diferente para el caso de un lector ignorante. Por lo tanto, es mejor evitar el uso de llaves por el bien de una mejor legibilidad de programación.

es decir, cuando tengo algo así como

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

  case 2: 
  ....
}

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

Al igual que tenemos declaraciones de salto a etiqueta en 'C', el control simplemente cambia al caso y continúa su ejecución. Por lo tanto, con ese entendimiento, es una mala práctica usar llaves ortopédicas al escribir casos para el cambio.

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

Mi sugerencia: solo evite usar aparatos ortopédicos circundantes para los casos de interruptores.


12
2018-03-11 10:55



Con llaves.

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

  1. Olvidando los descansos y teniendo casos fallidos
  2. Olvidando un caso predeterminado y por lo tanto no atrapando una condición no atendida
  3. Reutilizar accidentalmente las variables entre las declaraciones de casos, o peor aún, que afecta a una variable que IS comparte una variable entre las declaraciones de casos.

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


8
2018-03-11 06:27



Esta pregunta probablemente se cerrará como "argumentativa" (¡BRACE WAR!) Pero qué diablos. De hecho, me gustan las llaves después de los casos. Para mí, la fea sintaxis de los switches se parece más al resto de las construcciones idiomáticas. (No hay penalización por usar llaves en este "caso")


5
2018-03-11 06:07



Usted dice que las llaves se pueden omitir porque no se están reutilizando nombres de variables. Al reutilizar nombres de variables, supongo que te refieres a declarar una nueva variable del mismo tipo.

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


5
2018-03-11 06:13



No usaré llaves para cajas de interruptores.

  • La sentencia switch parece lo suficientemente barroca sin llaves.

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

Ahora vamos a mantener algún código C heredado que se divierte con cajas de 500 líneas ...


3
2018-03-11 09:42



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

Sin llaves ... menos sintaxis es más


1
2018-03-11 06:55