[英]Calling function inside of function
当我编写代码时,我会尝试将所有事物划分为函数(方法,如果您愿意的话)。 函数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 = { // 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;
}
}
就个人而言,我什至不建议您通过API公开这些内容。 而且,仅使用users.length
会更容易并且(至少在JavaScript中)更直观。
最终,我认为保持界面非常简单通常是一件好事。 抽象是一件好事。 如果我使用的是其他人的库,得知我希望手动增加该值会感到非常失望。
更新:
我认为还有一件事值得一提:
通过使代码在内部维护状态并保持API简单,不仅可以简化用户的生活,而且还可以防止滥用(在可能的范围内)。 容易想象一个场景,有人不正确地使用该增量方法,结果将破坏东西。
您说对了,“函数A做A-材料”是对的。 但是:一种对数据起作用的函数,该函数从外部隐藏(或多或少),应该对数据进行所需的处理(例如,添加用户),并确保数据仍然正确(例如,如果您有一个用户列表,请增加Usercounter使其始终正确)。 如果您想让您的API用户为您做这些事情,那还是很不舒服的。
想象一下,您向用户列表中添加了更多功能(例如,告诉用户已将其添加到列表中,将用户存储在二叉树中,依此类推),并且您必须从在您的功能之外,这样做的好处是什么?
我知道您只是想将示例代码作为一个简单的示例,但是对于诸如count或length变量之类的东西,我想不出为什么我想让其独立于函数进行设置的原因)添加或删除项目。 使用该对象时,您不需要每次add()
都必须调用add()
和 increment()
方法,并且您确实不希望在没有其他对象的情况下执行一个操作,否则您的对象最终会陷入无效状态。
因此,我永远不会做第一种方法,当然,您在编辑中添加的方法肯定会更糟。 让您的函数相互调用没有错,但是在您的示例中,我还是希望增量函数是私有的。
最好将count变量设为私有,并且只允许通过函数检索并通过add / remove函数进行设置(尽管当您只需要返回users.length
时,甚至不需要count变量)。 带有立即执行的匿名函数的以下模式使您可以拥有私有变量和函数,并且仅返回包含公共函数的对象。 公共函数仍然可以访问私有变量/函数,但是私有内容不能从外部访问。
var user = (function() {
var users = [], // private variables
private1,
private2;
function privateFunction1() { /* do something */ }
return {
getUserCount : function() {
return users.length;
},
addUser: function(user) {
users.push(user);
// return index of new user
return users.length - 1;
},
getUser : function(userIndex) {
return users[userIndex];
},
someFunc : function(someParam) {
return someParam + privateFunction1();
}
}
})();
user.addUser("Fred");
user.addUser("Mary");
console.log(user.getUserCount()); // 2
console.log(user.getUser(1)); // Mary
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.