【问题标题】:Getting rid of magic numbers in Java摆脱 Java 中的幻数
【发布时间】:2013-10-13 12:28:13
【问题描述】:

如何在不声明大量决赛或静态决赛的情况下摆脱 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);

【问题讨论】:

  • 这取决于值对每个值的含义以及它们是否可以在应用程序的运行时动态变化
  • @lc,是的。固定。
  • "不允许循环?"我的意思是,如果您妨碍我们使用最佳解决方案...
  • 没有真正好的方法——在 Java 或大多数语言中。我已经采取的一件事(在 Objective-C 中)是在 JSON 文本中编码“幻数”序列,该序列将在运行时进行解释。但这有很大的开销,这在某些情况下是可以的,而在其他情况下则不然。
  • 为什么不允许循环和数组?循环是正确的解决方案。 Stack Overflow 是要为您的问题找到解决方案,而不是玩愚蠢的游戏来解决问题。

标签: java magic-numbers


【解决方案1】:

定义常量确实是您唯一的选择。你反对使用它们是什么?在这种情况下,他们绝对值得他们的空间。未来的开发人员宁愿看到额外的常量,也不愿被这些数字的含义弄糊涂。

【讨论】:

  • +1。请使用命名良好的常量。它让其他人的工作变得无比轻松。
  • 是的,假设形状的位置是相关的,我会使用 one 命名常量,其余部分使用 *2*3 等。跨度>
【解决方案2】:

直接的答案是命名常量是避免代码中出现幻数的唯一方法。


但另一方面,幻数是否有害或有害的程度是有争议的。在这种特殊情况下,这些是否真的被称为“神奇”数字是有争议的……至少,IMO。

让我们来说明这一点:

// 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。)

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

【讨论】:

    【解决方案3】:

    我已经看到的 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);
    

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

    【讨论】:

    • 如果您曾经将GridBagConstraints 与 Swing 一起使用,您就会知道这种技术是多么令人讨厌。哈哈
    • 哈哈,我从来都不是GridBagConstraints 的忠实粉丝,它在我看来是一种“硬编码”的用户界面。我在学校看到过,但也更喜欢动态布局。
    猜你喜欢
    • 2020-08-08
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多