问题描述
|
解决方法
绝对没有文字常数有其位置,尤其是低常数,例如
0
,1
,2
,...
我认为没有人会想到
double[] pair = new double[PAIR_COUNT];
比
double[] pair = new double[2];
我会说如果要使用final变量
...提高了可读性,
...该值可能会更改(并在多个地方使用),或者
...作为文档
一个相关的旁注:与编码标准/约定一样:很少要严格遵守(如果有)规则。
, 如果数字本身仅具有数字含义,其含义本身并不明显,那么用常量替换数字是有意义的。
例如,
productType = 221; // BAD: the number needs to be looked up somewhere to understand its meaning
productType = PRODUCT_TYPE_CONSUMABLE; // GOOD: the constant is self-describing
另一方面,
int initialCount = 0; // GOOD: in this context zero really means zero
int initialCount = ZERO; // BAD: the number value is clear,and there\'s no need to add a self-referencing constant name if there\'s no other meaning
, 一般而言,如果文字具有特殊含义,则应为其赋予唯一的名称,而不是假设事物。我不确定为什么这样做很难/乏味。
Object[] result = new Object[2];
=>似乎是使用Pair类的不错选择
cellnum = 0;
=> cellnum = FIRST_COLUMN;尤其是因为您可能最终会使用将1视为起始索引的API,或者可能要处理从2开始的excel。
return ssn.substring(1,3)+\"-\"+ssn.substring(3,5)+\"-\"+ssn.substring(5,9)
=>如果您在整个代码库中堆满了这样的代码,则会遇到更大的问题。如果此代码存在于单个位置并被健全的API保护,那么我在这里看不到任何问题。
, 我见过人们认为0和1被接受的例外。
想法是要记录为什么您有两个上述对象的原因。
我同意SSN中的破折号。注释比4个命名常量更好地描述了它。
总的来说,我喜欢没有魔术数字的想法,但是就像每条规则一样,都涉及到语用学。旧版代码带来了自己的问题。以这种方式更新旧代码的行为改变了很多工作,但是却没有很多生产力。我会考虑以一种渐进的方式进行操作:当您必须编辑旧文件时,请将其更新。
, 它真的取决于上下文,不是吗。如果代码中的数字不能说明它们为什么存在,那么命名它们会使代码更具可读性。如果在代码中看到数字3.14,是PI吗?有什么办法可以说还是只是巧合?将其命名为PI将消除神秘感。
在您的示例中,为什么cellnum = 2?为什么不10?还是20?应该将其命名为INITIAL_CELL或MAX_CELL。特别是如果这个相同的数字(意味着相同的事物)再次出现在代码中。
, 取决于是否需要更改。或者,可以更改它。
如果您仅需要2个对象(例如,对于提到的像aioobe这样的对象),那么那不是一个魔术数字,而是正确的数字。如果这是用于变量元组(此时为2),那么您可能应该将其抽象为一个常数。