“链式调用(方法链)”的概念与误区

转载自:http://www.web-tinker.com/article/20153.html

 不知从什么时候开始,“链式调用”这个词汇会在中文IT界中蔓延开来。我没有找到相应的英文词汇,就是有“chained calls”这个词组也只是偶然存在与某些句子中罢了。然而,很多人对这个“链式调用”开始望文生义了,于是出现了一堆所谓的“链式调用”。
  首先要指出的是,“链式调用”这个词本身就有问题。当我看到“chained calls”这个词组的时候,我的脑子里浮现出的是一堆美国大兵在报数的场景。



  当然,这是狭义的理解。“链式调用”是一个泛概念,到底是什么东西的链式调用不明确。函数的返回值是一个函数时,函数也能链式调用;函数的返回值是一个对象时,直接调用返回值中对象的方法也是链式调用。但是前者显然是没有意义的。这个概念的提出显然不是用来说明函数的返回值可以直接调用这么个脑残事情。真正有意义的链式调用是后者,也就是方法链( method chaining)。方法链这个词是有的,而且使用的很广泛。其实很多人口中的“链式调用”实际上就是指方法链。但是“链式调用”这个词语还可以描述函数调用链,所以让它自身的存在价值变得难以理解。
  我总结的方法链的价值有这么几个:
     1. 让调用过程更接近自然语言。
    2. 把原本参数列表复杂的方法化作多个参数列表简单的方法来使用。
    3. 减少不必要的代码量。

  这个三点都是有益于开发的,所以方法链的存在很有意义。jQuery的很多东西就是使用了方法链的概念。下面是一个jQuery的例子。 //发送一个post请求,成功执行done内的回调,这样写更接近自然语言
//把参数列表相对复杂post方法化作只有一个参数的post和done方法来使用
$.post("test.php").done(function(){
  //成功时的操作
});
//减少不必要的代码量,避免每次从$("#btn")开始执行方法
$("#btn").css("color","red").attr("href","#");
  jQuery是一个很优秀的库,这些写法都是非常实用的。现在我们看看所谓“链式调用”的另一个狭义概念,函数调用链那获取到底是有多脑残。 function f(i){
  return function(e){
    i+=e;
    return function(e){
      i+=e;
      return function(e){
        alert(i+e);
      };
    };
  };
};
f(1)(2)(3)(4); //10
  谁要是敢这样写代码马上抓出去揍一顿!这样的写法简直毫无优点,使用者需要记住每个括号调用的含义,还需要记住调用的层数。而且每次调用都需要创建很深的调用堆栈,效率上实在不如普通函数的写法。(后面省略1000句骂它的)
  总之,如果“链式调用”这个词还是尽量别用,因为无法从字面判断含义。除非你想说明的是上面这个脑残东西,你可以用“链式调用”去说,如果只是想描述方法链的概念,就直接说方法链就行了。       

    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 1
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值