摆脱Java中的幻数



如何在不声明大量决赛或静态决赛的情况下摆脱 java 中的幻数?请记住循环,数组是不允许的。似乎不可能?感谢帮助。谢谢。

示例代码:

drawOval(5, 5, width, height);
drawOval(10, 10, width, height);
drawOval(15, 15, width, height);
drawOval(20, 20, width, height);
drawOval(25, 25, width, height);

定义常量实际上是您唯一的选择。你反对使用它们是什么?在这种情况下,它们绝对值得一席之地。未来的开发人员宁愿看到额外的常量,也不愿对这些数字的含义感到困惑。

直接的答案是,命名常量是避免在代码中使用幻数的唯一方法。

<小时 />

但另一方面,魔术数字是否有害或有害程度是有争议的。 在这种特殊情况下,这些是否真的有资格成为"神奇"数字是值得商榷的......至少,海事组织。

让我们来说明这一点:

// Alternative #1
private final int PLACE_1_X = 5;
private final int PLACE_1_Y = 5;
...
drawOval(PLACE_1_X, PLACE_1_Y, width, height);
// Alternative #2
drawOval(5, 5, width, height);

其中哪一个实际上更具可读性? 定义命名常量(最有可能在源代码的不同点!(是否更容易理解正在发生的事情? 你现在不是有一个问题,你必须在两个地方而不是一个地方看一个地方才能理解一个特定的drawOval调用将绘制什么?

<小时 />

底线是,"没有幻数"的教条只有在数字的含义从上下文中不言而喻时才真正适用......或者当数字实际上是重复使用的常量时。 (就像我们要在同一张"图片"中多次使用PLACE_1一样。

你需要考虑上下文,而不仅仅是盲目地应用教条。

我已经看到的 finals/static 的替代方案是使用自定义对象作为参数:

public void drawOval(OvalArg arg) {
    // ...
}
OvalArg arg = new OvalArg();
arg.first = 10;
arg.second = 10;
arg.width = 100;
arg.height = 500;
drawOval(arg);

但是,此方法意味着您无法直接查看必须将哪些参数发送到方法(除非您查看参数对象(,并且需要额外的验证以确保正确填充自定义对象。出于这个原因,我建议使用常量。

除了其他答案之外,我们还可以使用枚举来声明常量,它们可以附加宽度和高度等值。

public enum Dimensions {
  
  DIMENSION_FIVE_FIVE(5, 5);
  private final int height;
  private final int weight;
  private Dimensions(int height, int width) {
     this.height = height;
     this.weight = weight;
  }
}

请忽略我的命名约定,欢迎提出建议。

相关内容

  • 没有找到相关文章

最新更新