繁体   English   中英

在函数内部调用函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM