Javascript 在函数内部调用函数
当我编写代码时,我会尝试将所有内容划分为函数(方法,如果您愿意的话)。函数X填充X,Y填充凝灰岩Y和不类似方法X填充X,Y和Z!这给了我更多可重用的代码。我喜欢。:) 让我们看看这段代码:Javascript 在函数内部调用函数,javascript,oop,coding-style,code-reuse,Javascript,Oop,Coding Style,Code Reuse,当我编写代码时,我会尝试将所有内容划分为函数(方法,如果您愿意的话)。函数X填充X,Y填充凝灰岩Y和不类似方法X填充X,Y和Z!这给了我更多可重用的代码。我喜欢。:) 让我们看看这段代码: var user = { users: [], userCount: 0, addUser: function(user) { (this.users).push(user); }, incrementCount: function() { ++this.userCount
var user = {
users: [],
userCount: 0,
addUser: function(user) {
(this.users).push(user);
},
incrementCount: function() {
++this.userCount;
}
}
var user = { // 2nd example.
users: [],
userCount: 0,
addUser: function(user) {
(this.users).push(user);
++this.userCount;
}
}
(它是用JavaScript编写的,但这里的语言不是必需的。)
在我看来,第二个示例对于API用户来说将更容易且更安全。
很容易忘记调用user.incrementCount()
。你怎么认为?第二个例子是自动完成的
那么如何找到平衡呢?在函数内部调用函数的最佳实践是什么
谢谢你阅读这篇文章
编辑:
我刚才想到:
var user = {
users: [],
userCount: 0,
addUser: function(user) {
(this.users).push(user);
this.incrementCount();
},
incrementCount: function() {
++this.userCount;
}
}
在JS中有点不同,因为当使用对象文字符号时,没有一种方法可以使函数真正私有化,但是 这都是关于您希望对象向其使用者公开的API。您希望API的使用者能够在添加用户的同时单独增加计数吗?如果是:
{ addUser: /* snip */, incrementCount: /* snip */ }
否则:
{ addUser: /* snip */, _incrementCount: /* snip */ }
// or just
{ addUser: /* snip */ }
在这种情况下,我强烈建议不要存储任何单独的计数,因为users
数组已经为您存储了
var user = {
_users: [],
addUser: function(user) {
this._users.push(user);
},
getUserCount: function () {
return this._users.length;
}
// and if you need to expose the users array directly,
, getUsers: function () {
return this._users;
}
}
在JS中有点不同,因为当使用对象文字符号时,没有一种方法可以使函数真正私有化,但是 这都是关于您希望对象向其使用者公开的API。您希望API的使用者能够在添加用户的同时单独增加计数吗?如果是:
{ addUser: /* snip */, incrementCount: /* snip */ }
否则:
{ addUser: /* snip */, _incrementCount: /* snip */ }
// or just
{ addUser: /* snip */ }
在这种情况下,我强烈建议不要存储任何单独的计数,因为users
数组已经为您存储了
var user = {
_users: [],
addUser: function(user) {
this._users.push(user);
},
getUserCount: function () {
return this._users.length;
}
// and if you need to expose the users array directly,
, getUsers: function () {
return this._users;
}
}
你说的“函数A做的是A”是对的
但是:一个对数据起作用的函数,从外部隐藏(或多或少),应该对数据执行您想要的操作(例如添加一个用户),并使舒尔保持数据的正确性(例如,如果您有一个用户列表,则增加Usercounter以使舒尔始终正确)。
如果你想让API的用户为你做这件事,那无论如何都是不舒服的
想象一下,你在用户列表中添加了更多功能(例如,告诉用户它已添加到列表中,将用户存储在二叉树中,等等),你必须从功能外部完成所有组织工作,这有什么好处 你说得对,“函数A做A-东西。”
但是:一个对数据起作用的函数,从外部隐藏(或多或少),应该对数据执行您想要的操作(例如添加一个用户),并使舒尔保持数据的正确性(例如,如果您有一个用户列表,则增加Usercounter以使舒尔始终正确)。
如果你想让API的用户为你做这件事,那无论如何都是不舒服的
想象一下,你在用户列表中添加了更多功能(例如,告诉用户它已添加到列表中,将用户存储在二叉树中,等等),你必须从功能外部完成所有组织工作,这有什么好处 就个人而言,我认为你甚至不应该通过API公开这些东西。而且,只要使用
users.length
,就会更容易(至少在JavaScript中)更直观
最后,我认为保持你的界面简单通常是一件好事。抽象是一件好事。如果我正在使用其他人的库,我会非常失望地得知我被期望手动增加该值
更新:
我认为还有一件事值得一提:
通过让您的代码在内部维护状态并保持API的简单,您不仅可以简化用户的生活,而且还可以防止误用(在可能的范围内)。很容易想象有人不正确地使用增量方法,结果会破坏东西。就个人而言,我认为你甚至不应该通过API公开这些东西。而且,只要使用
users.length
,就会更容易(至少在JavaScript中)更直观
最后,我认为保持你的界面简单通常是一件好事。抽象是一件好事。如果我正在使用其他人的库,我会非常失望地得知我被期望手动增加该值
更新:
我认为还有一件事值得一提:
通过让您的代码在内部维护状态并保持API的简单,您不仅可以简化用户的生活,而且还可以防止误用(在可能的范围内)。很容易想象有人不正确地使用增量方法,结果它会破坏东西。我知道您只是想让示例代码成为一个简单的示例,但是对于计数或长度变量之类的东西,我想不出为什么我要让它独立于函数设置添加或删除项目的。当使用对象时,您不希望每次添加时都必须调用
add()
和increment()
方法,并且您确实不希望在没有其他方法的情况下执行一个操作,否则您的对象将处于无效状态
所以我从来不会用第一种方法,当然你在编辑中添加的方法更糟糕。让函数相互调用没有什么错,但在您的示例中,我希望增量函数是私有的
最好将count变量设置为私有,只允许通过函数检索它,并通过添加/删除函数设置它(尽管当您只需返回用户时,您甚至不需要count变量。length