2016-03-04 149 views
1

为避免将大量参数传递到函数中,Node/Javascript中推荐的模式的最佳做法是什么?避免在JavaScript中传递大量参数的最佳做法

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

它应该带入一个对象吗?

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

function create(input) { 
} 

的对象似乎很容易出错,因为没有关于它应该包含属性和键值名的数量没有验证。

+0

对于您传递的参数数量没有任何验证。你可以定义一个函数,它不接受任何参数,并且仍然传递一些东西给它,请注意你有一个名为'arguments'的默认对象,你仍然可以访问这些“隐藏的”参数。根本没有任何验证,除了你在js中做的任何事情。 – scrappedcola

回答

1

一个对象似乎很容易出错,因为它不应该包含属性 和密钥。

我可以将一个函数和一个HTML元素传递给你的第一个函数;它可能会失败。

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

请注意,像TypeScript这样的语言对于希望在“编译时”执行这种正确性的人很有帮助。

0

如果你喜欢你的例子,你可以使用Object.keys(input)访问密钥,然后你可以检查长度或做额外的验证。你可以看到,如果财产至少3个字符使用类似:

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

它应该在的对象?

节点几乎专用于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个参数和大量的警卫。你将来的调试自我会感谢你。

所以专门解决这个问题:

什么是节点/ JavaScript中的最佳实践建议模式,以避免将大量的参数成函数?

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

相关问题