Parameters 何时使用常量作为参数而不是神奇值

Parameters 何时使用常量作为参数而不是神奇值,parameters,constants,Parameters,Constants,我已经读到(并且普遍同意)为了增加代码的易读性,应该使用常量而不是幻数作为方法参数。例如,使用PHP: // no constants //////////////////// function updateRecord($id) { if ($id == -1) { // update all records } else { // update record with "id = $id" } } updateRecord(-1);

我已经读到(并且普遍同意)为了增加代码的易读性,应该使用常量而不是幻数作为方法参数。例如,使用PHP:

// no constants ////////////////////
function updateRecord($id) {
    if ($id == -1) {
        // update all records
    } else {
        // update record with "id = $id"
    }
}

updateRecord(-1); // future maintainer says: "wtf does -1 do?"
                  // and then has to jump to the function definition

// with constants: /////////////////

define('UPDATE_ALL', -1);

function updateRecord($id) {
    if ($id == UPDATE_ALL) {
        // update all records
    } else {
        // update record with "id = $id"
    }
}

updateRecord(UPDATE_ALL); // future maintainer says: "woot"
是的,这不是一个很好的例子,我知道

所以,我可以看出这是一件更好的事情,但它提出了一个问题:你应该多久做一次?如果对每个函数都是这样,那么最终会得到一大堆常量定义


你会在哪里划清界限?始终坚持使用常量而不是幻数,或者根据所讨论函数的使用情况采取混合方法?

如果你在类中包装东西,并且使用类常量,那么问题就不那么严重了。除了路径之外,我很少使用全局常量

所以,我可以看出这是一件更好的事情,但它提出了一个问题:你应该多久做一次?如果对每个函数都是这样,那么最终会得到一大堆常量定义

如果每个函数都采用“魔法参数”,那么您已经犯了可怕的错误


我总是使用常量。如果你认为这意味着你有太多的常数,那么这只是反映了你设计中的其他缺陷。

我会在它的地方使用它

  • 提高可读性
  • 帮助你记住
  • 让我们看一下你作为论点所传递的信息
以PHP为例。这是有道理的:

sort($array, SORT_NUMERIC);
但这会吗

sort($array, 2); // Haven't actually dug in to see what it matches, but you get the point

正如您已经指出的,未来的维护人员将感谢您明确的命名。这个维护者甚至可能是你,我一次又一次地惊讶于我忘记了我自己的代码,当我已经有一段时间没有工作的时候,再次理解它是多么困难

我肯定会一直使用常量,只要范围大于一个简单的方法。一旦开始传递这些值,IMHO必须将它们定义为常量。在一个方法中,可以使用注释。但是,这不会帮助代码的任何调用方看到该注释。即使是同一类中的另一个方法也应该被视为“API客户机”,它不应该知道它在这方面调用的其他方法的实现细节


使用支持“真实”枚举的语言(如Java 5中引入的Java
enum
关键字),您甚至可以获得类型安全性,并且不存在基于整数的常量可能存在的唯一性问题

您应该尽量将代码中的文字量保持在绝对最小:每个文字量都是一个潜在的问题,因为您的环境可能会发生变化,而且其他开发人员可能不知道它的含义

当我开始一个项目时,我总是将一个文件专门用于命名常量,通常包装在一个专门用于命名常量的类中,并且我自由地使用它们,因为我的工作性质需要它。所有命名常量都驻留在该文件中,并由该文件控制,使您能够对命名常量进行出色的组织和控制。您还可以使用注释或代码区域将它们组织到组中,并根据语言,在另一个组上嵌套和构建一个组

多年来,这种做法帮助了我无数次