避免幻数之类的最佳做法应该走多远?

问题描述

|                                                                                                                       

解决方法

        绝对没有文字常数有其位置,尤其是低常数,例如
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),那么您可能应该将其抽象为一个常数。