在函数内部调用函数

daG*_*vis 1 javascript oop code-reuse coding-style

当我编写代码时,我会尝试将所有内容划分为函数(方法,如果您愿意).函数X做东西X,Y做Tuff 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

(它是用JavaScript编写的,但这里的语言不是必需的.)

在我看来,第二个例子将更容易和更安全地使用,比方说,API用户.忘记打电话很容易user.incrementCount().你怎么看?第二个例子自动完成.

那么如何找到平衡点呢?关于在函数内调用函数的任何最佳实践?

感谢您阅读本文.

编辑:

我刚才想到了这个:

var user = {
  users: [],
  userCount: 0,
  addUser: function(user) {
    (this.users).push(user);
    this.incrementCount();
  },
  incrementCount: function() {
    ++this.userCount;
  }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 5

它在JS中有点不同,因为在使用对象文字符号时没有办法使函数真正私有,但......

这就是您希望对象向其消费者公开的API.您是否希望API的使用者能够与添加用户分开增加计数?如果是这样:

{ addUser: /* snip */, incrementCount: /* snip */ }
Run Code Online (Sandbox Code Playgroud)

除此以外:

{ addUser: /* snip */, _incrementCount: /* snip */ }
// or just
{ addUser: /* snip */ }
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我强烈建议不要存储任何单独的计数,因为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;
  }
}
Run Code Online (Sandbox Code Playgroud)