linea - En cuanto a las sentencias de cambio de Java, utilizando saltos de retorno y omisión en cada caso
salto de linea en jbutton java (10)
Dado este método, ¿esto representa algún error grave semántico o estilístico?
private double translateSlider(int sliderVal) {
switch (sliderVal) {
case 0:
return 1.0;
case 1:
return .9;
case 2:
return .8;
case 3:
return .7;
case 4:
return .6;
default:
return 1.0;
}
}
Claramente no está en línea con los tutoriales de Java here .
Sin embargo, es claro, conciso y hasta ahora ha producido exactamente lo que necesito. ¿Existe una razón convincente y pragmática para crear una variable local, asignarle un valor dentro de cada caso, agregar un corte a cada caso y devolver el valor al final del método?
¿Por qué no solo
private double translateSlider(int sliderval) {
if(sliderval > 4 || sliderval < 0)
return 1.0d;
return (1.0d - ((double)sliderval/10.0d));
}
¿O similar?
Asignar un valor a una variable local y luego devolverlo al final se considera una buena práctica. Los métodos que tienen salidas múltiples son más difíciles de depurar y pueden ser difíciles de leer.
Dicho eso, ese es el único punto positivo que queda para este paradigma. Se originó cuando solo existían los lenguajes de procedimiento de bajo nivel. Y tuvo mucho más sentido en ese momento.
Mientras estamos en el tema, debes verificar esto . Es una lectura interesante
Creo que lo que has escrito está perfectamente bien. Tampoco veo ningún problema de legibilidad al tener una declaración de devolución múltiple. Yo siempre preferiría volver desde el punto en el código cuando sé que volveré y esto evitará ejecutar la lógica debajo de la devolución. Sin embargo, puede haber un argumento de tener un único punto de retorno para la depuración y también el registro, en su caso. Pero, en su código, no hay problemas de depuración y registro si lo usamos. es muy simple y legible de la forma en que escribiste.
Desde la inteligencia humana, ve tu código está bien. Desde la vista de herramientas de análisis de código estático, hay varias devoluciones, lo que dificulta la depuración. por ejemplo, no puede establecer un punto de interrupción único inmediatamente antes de regresar.
Además, no sería difícil codificar los 4 pasos del control deslizante en una aplicación profesional. Calcule los valores usando max - min, etc., o búsquelos en una matriz:
public static final double[] SLIDER_VALS = {1.0, 0.9, 0.8, 0.7, 0.6};
public static final double SLIDER_DEFAULT = 1.0;
private double translateSlider(int sliderval) {
double ret = SLIDER_DEFAULT;
if(sliderval >= 0 && sliderval < SLIDER_VALS.length) {
ret = SLIDER_VALS[sliderval];
}
return ret;
}
El mejor caso para la lógica humana de bytecode generado por computadora sería utilizar código como el siguiente:
private double translateSlider(int sliderVal) {
float retval = 1.0;
switch (sliderVal) {
case 1: retval = 0.9;
case 2: retval = 0.8;
case 3: retval = 0.7;
case 4: retval = 0.6;
case 0:
default: break;
}
return retval;
}
De este modo, se eliminan las salidas múltiples del método y se utiliza el lenguaje lógicamente. (es decir, mientras sliderVal es un rango de interger de 1-4, cambie el valor flotante de lo contrario si sliderVal es 0 y el resto de valores, retval permanece el mismo valor flotante de 1.0)
Sin embargo, algo así con cada valor entero de sliderVal siendo (n-(n/10))
uno realmente podría hacer una lambda y obtener resultados más rápidos:
private double translateSlider = (int sliderVal) -> (1.0-(sliderVal/10));
Editar: Un módulo de 4 puede ser para mantener la lógica (es decir, (n-(n/10))%4)
)
Esto está perfectamente bien si no tiene ningún código que siga su bloque de interruptor en el método.
Pero como buena práctica general del programa, debería evitar tener demasiadas declaraciones de devolución, ya que reduce la legibilidad de su código.
No, lo que tienes está bien. También podría hacer esto como una fórmula ( sliderVal < 5 ? (1.0 - 0.1 * sliderVal) : 1.0
) o usar un Map<Integer,Double>
, pero lo que tiene está bien.
Si esto está bien. Los tutoriales no son siempre concisos y prolijos. No solo eso, la creación de variables locales es un desperdicio de espacio e ineficiente
Si va a tener un método que solo ejecute el interruptor y luego devuelve algún valor, entonces seguro que esto funciona. Pero si quiere un cambio con otras cosas en un método, entonces no puede usar return o el resto del código dentro del método no se ejecutará. Observe en el tutorial cómo tiene una impresión después del código? La tuya no podría hacer esto.
Sugiero que no uses literales.
Aparte de eso, el estilo en sí se ve bien.