避免在JavaScript中传递大量参数的最佳实践

时间:2016-03-04 03:25:42

标签: javascript node.js

Node / Javascript中推荐的最佳模式是什么,以避免将大量参数传递给函数?

function create(firstName, lastName, address, phoneNumber, username, password, dateOfBirth, age) {
   ...
}

它应该接受一个物体吗?

const input = {
    firstName: 'John',
    lastName: 'Doe',
    ...
};

function create(input) {
}

对象似乎容易出错,因为它没有验证它应包含的属性数量和密钥名称。

3 个答案:

答案 0 :(得分:1)

  

对象似乎容易出错,因为没有对数字进行验证   它应包含的属性和键。

我可以传入一个函数和一个HTML元素,而不是第一个函数;它可能会失败。

它的核心是任何脚本语言的基本问题。知道你搞砸了一个函数的唯一方法通常是运行时错误。一旦它被正确编码,那就不用担心了。

请注意,像TypeScript这样的语言对那些希望在编译时#34;强制执行此类正确性的人们有很大帮助。

答案 1 :(得分:1)

  

它应该接受一个物体吗?

Node几乎专门用于Web服务器。在这种情况下,您的入口点是典型的req.body,一个对象。谁知道那个对象到底是什么?所以你在服务器前面处理错误:

function bindUser(postBody, callback) {

    var user = {};

    if (!postBody.firstName) {
        return callback(new Error("Missing firstName"));
    }
    user.firstName = postBody.firstName;

    if (!postBody.lastName) {
        return callback(new Error("Missing lastName"));
    }
    user.lastName = postBody.lastName;

    if (!postBody.email) {
        return callback(new Error("Missing email"));
    }
    user.email = postBody.email.toLowerCase();

    callback(null, user);
}

恭喜,您已经拥有了一个已知对象,并且您将来的调试具有一致的起点。现在,您构建了执行一项特定任务的辅助函数,例如结合全名:

function combineName(firstName, lastName) {
    return firstName + " " + lastName;
}
user.fullName = combineName(user.firstName, user.lastName);

将错误处理重点放在不完全包含的环境中,即I / O和外部模块。除此之外,保持你的功能小而具体,他们不需要10个参数和大量的守卫墙。你未来的调试自己会感谢你。

所以要专门解决这个问题:

  

Node / Javascript中推荐的最佳模式是什么,以避免将大量参数传递给函数?

设计你的应用程序,使函数不需要10个参数。

答案 2 :(得分:0)

如果您在示例中执行此操作,则可以使用Object.keys(input)访问密钥,然后您可以检查长度或执行其他验证。您可以使用以下内容查看属性是否至少为3个字符:

var keys = Object.keys(input);
keys.every(function(key) {
  return key.length > 3;
});