63

鉴于这种方法,这是否代表了一些令人震惊的文体或语义失礼:

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

它显然不符合这里的 Java 教程。

但是,它很清楚,简洁,到目前为止已经产生了我所需要的。是否有一个令人信服的、务实的理由来创建一个局部变量,在每个案例中为其分配一个值,为每个案例添加一个中断并在方法结束时返回值?

4

10 回答 10

78

将值分配给局部变量,然后在最后返回该值被认为是一种好习惯。具有多个出口的方法更难调试并且难以阅读。

也就是说,这是该范式剩下的唯一优点。它起源于只有低级程序语言出现的时候。在那个时候它更有意义。

当我们讨论这个话题时,您必须检查一下。这是一本有趣的书。

于 2013-08-12T16:42:59.423 回答
7

从人类智能的角度来看,您的代码很好。从静态代码分析工具来看,有多个返回,这使得调试变得更加困难。例如,您不能在返回之前立即设置一个且唯一的断点。

此外,您不会在专业应用程序中对 4 个滑块步骤进行硬编码。要么使用 max - min 等计算值,要么在数组中查找它们:

public static final double[] SLIDER_VALUES = {1.0, 0.9, 0.8, 0.7, 0.6};
public static final double SLIDER_DEFAULT = 1.0;


private double translateSlider(int sliderValue) {
  double result = SLIDER_DEFAULT;
  if (sliderValue >= 0 && sliderValue < SLIDER_VALUES.length) {
      ret = SLIDER_VALUES[sliderValue];
  }

  return result;
}
于 2013-08-12T16:46:57.627 回答
2

我认为你写的很好。我也没有看到有多个返回语句的任何可读性问题。

当我知道要返回时,我总是更喜欢从代码中的点返回,这将避免在返回下方运行逻辑。

可以有一个参数用于调试和日志记录的单个返回点。但是,在您的代码中,如果我们使用它,则不存在调试和日志记录的问题。您编写的方式非常简单易读。

于 2013-08-12T16:47:49.343 回答
0

不,你所拥有的一切都很好。您也可以将其作为公式 ( sliderVal < 5 ? (1.0 - 0.1 * sliderVal) : 1.0) 或使用 a Map<Integer,Double>,但您所拥有的一切都很好。

于 2013-08-12T16:43:14.830 回答
0

我建议你不要使用文字。

除此之外,风格本身看起来还不错。

于 2013-08-12T16:43:19.863 回答
0

如果您将拥有一个仅运行开关然后返回一些值的方法,那么请确保这种方式有效。但是,如果您想在方法中使用其他内容进行切换,则不能使用 return 或方法中的其余代码将不会执行。请注意教程中的代码后如何打印?你的将无法做到这一点。

于 2013-08-12T16:43:28.957 回答
0

为什么不只是

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

还是类似的?

于 2013-08-12T16:44:22.243 回答
0

人类逻辑到计算机生成的字节码的最佳情况是使用如下代码:

private double translateSlider(int sliderVal) {
  float retval = 1.0;

  switch (sliderVal) {
    case 1: retval = 0.9; break;
    case 2: retval = 0.8; break;
    case 3: retval = 0.7; break;
    case 4: retval = 0.6; break;
    case 0:
    default: break;
  }
  return retval;
}

从而消除了该方法的多个出口并在逻辑上利用了该语言。(即,当sliderVal 是1-4 的整数范围时,如果sliderVal 为0 和所有其他值,则更改浮点值,retval 保持与1.0 相同的浮点值)

然而,像这样的情况,sliderVal 的每个整数值都是(n-(n/10))一个,真的可以做一个 lambda 并获得更快的结果:

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

编辑:模数 4 可能是为了保持逻辑(即(n-(n/10))%4)

于 2015-06-30T19:55:00.530 回答
0

尽管这个问题已经足够老了,但现在仍然可以参考。

从语义上讲,这正是 Java 12 引入的 ( https://openjdk.java.net/jeps/325 ),因此,正是在那个简单的示例中,只要我看不到任何问题或缺点。

于 2020-12-12T17:12:49.047 回答
-2

是的,这很好。教程并不总是简洁而整洁。不仅如此,创建局部变量是浪费空间,效率低下

于 2013-08-12T16:44:38.883 回答