webentwicklung-frage-antwort-db.com.de

In Bezug auf Java-Switch-Anweisungen: Verwenden Sie jeweils Rückgabe- und Ausschlussbrüche

Stellt dies bei dieser Methode einen ungewöhnlichen stilistischen oder semantischen Fauxpas dar:

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;
    }
}  

Es steht eindeutig nicht im Einklang mit den Java-Tutorials hier

Es ist jedoch klar, prägnant und hat bisher genau das gebracht, was ich brauche. Gibt es einen zwingenden, pragmatischen Grund, eine lokale Variable zu erstellen, ihr in jedem Fall einen Wert zuzuweisen, jedem Fall eine Pause hinzuzufügen und den Wert am Ende der Methode zurückzugeben? 

40
NickAbbey

Das Zuweisen eines Wertes zu einer lokalen Variablen und das Zurückgeben des Werts am Ende wird als bewährte Methode betrachtet. Methoden mit mehreren Exits sind schwieriger zu debuggen und können schwer zu lesen sein.

Das ist der einzige Pluspunkt, den dieses Paradigma noch hat. Es entstand, als es nur einfache Verfahrenssprachen gab. Und es war damals viel sinnvoller.

Während wir uns mit dem Thema befassen, müssen Sie das herausfinden . Es ist eine interessante Lektüre.

48
rocketboy

Aus Sicht der menschlichen Intelligenz ist Ihr Code in Ordnung. In der Ansicht der statischen Codeanalyse-Tools gibt es mehrere Rückgaben, was das Debuggen erschwert. Sie können beispielsweise vor der Rückkehr nicht sofort einen einzigen Haltepunkt setzen.

Außerdem würden Sie die 4 Schieberegler-Schritte in einer professionellen App nicht hart codieren. __ Berechnen Sie die Werte entweder mit max - min usw. oder.

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;
}
6
AlexWien

Bester Fall für eine vom Menschen erzeugte, vom Computer erzeugte Bytecode wäre die Verwendung von Code wie folgt:

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;
}

Das Eliminieren von Multiblen wird dadurch beendet und die Sprache logisch verwendet. (dh wenn sliderVal ein Interger-Bereich von 1 bis 4 ist, ändern Sie den Float-Wert. Andernfalls, wenn SliderVal 0 und alle anderen Werte ist, bleibt retval der gleiche Float-Wert von 1,0.

Mit etwas wie diesem, wobei jeder ganzzahlige Wert von sliderVal (n-(n/10)) ist, könnte man wirklich ein Lambda machen und schnellere Ergebnisse erzielen:

private double translateSlider = (int sliderVal) -> (1.0-(sliderVal/10));

Bearbeiten: Ein Modul von 4 kann sein, um die Logik zu erhalten (dh (n-(n/10))%4))

1
Dwight Spencer

Dies ist vollkommen in Ordnung, wenn Sie keinen Code hinter Ihrem Switch-Block in der Methode haben.

Generell sollten Sie jedoch zu viele return-Anweisungen verwenden, da dies die Lesbarkeit des Codes verringert.

1
Juned Ahsan

Ich denke, dass das, was Sie geschrieben haben, vollkommen in Ordnung ist. Ich sehe auch kein Problem mit der Lesbarkeit, wenn mehrere Anweisungen für die Rückgabe vorliegen. Ich würde es immer vorziehen, von dem Punkt im Code zurückzukehren, an dem ich weiß, dass ich zurückkehren möchte. Dadurch wird vermieden, dass Logik unterhalb der Rückkehr ausgeführt wird. .__ Es kann jedoch ein Argument vorkommen, dass es einen einzigen Rückgabepunkt für das Debugging und ggf. auch das Protokollieren gibt. In Ihrem Code gibt es jedoch kein Problem mit dem Debuggen und Protokollieren, wenn wir es verwenden. Es ist sehr einfach und lesbar, wie Sie es geschrieben haben. 

0
Kevin Bhuva

Nein, was du hast, ist gut. Sie können dies auch als Formel tun (sliderVal < 5 ? (1.0 - 0.1 * sliderVal) : 1.0) oder einen Map<Integer,Double> verwenden, aber was Sie haben, ist in Ordnung.

0
yshavit

Ich schlage vor, dass Sie keine Literale verwenden.

Abgesehen davon sieht der Stil selbst gut aus.

0

Wenn Sie eine Methode haben werden, bei der der Switch nur ausgeführt wird und dann ein Wert zurückgegeben wird, dann funktioniert diese Methode. Wenn Sie jedoch einen Schalter mit anderen Elementen in einer Methode wünschen, können Sie return nicht verwenden, oder der Rest des Codes in der Methode wird nicht ausgeführt. Beachten Sie im Tutorial, wie es nach dem Code gedruckt wird? Ihre wären dazu nicht in der Lage.

0
DanielD

Warum nicht gerade? 

private double translateSlider(int sliderval) {
if(sliderval > 4 || sliderval < 0)
    return 1.0d;
return (1.0d - ((double)sliderval/10.0d));
}

Oder ähnliches?

0
SubSevn

Ja, das ist gut. Die Tutorials sind nicht immer konsistent und sauber. Nicht nur das Erstellen lokaler Variablen ist Platzverschwendung und ineffizient

0
Xperiaz X