2

How do I get rid of magic numbers in java without declaring a massive amount of finals or static finals? Keep in mind looping, arrays are not allowed. It doesn't seem possible? Help appreciated. thanks.

Example code:

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);
4

3 回答 3

6

Defining constants is really your only option. What's your opposition to using them? They are definitely worth their space in this context. Future developers would much rather see extra constants than be confused by what those numbers mean.

于 2013-10-07T02:30:10.277 回答
3

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


但另一方面,幻数是否有害或有害程度尚有争议。在这种特殊情况下,这些是否真的有资格成为“神奇”数字是有争议的……至少,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在同一张“图片”中使用很多次一样。)

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

于 2013-10-07T03:04:45.110 回答
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);

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

于 2013-10-07T02:36:09.140 回答