资讯专栏INFORMATION COLUMN

从 PHP、Promise、Android 和 iOS 代码看如何链式编程

chaosx110 / 1966人阅读

摘要:函数就好将值进行镀金,修改对象的状态和属性,最后返回结果可以进行后续操作。只要条件允许,你可以一直下去,如链式写法是目前最火的前端构建工具之一,在上也是最火的工具之一。

链式编程或者链式写法,是将多个方法 (函数) 通过点号 (.) 或者 (->)等符号链接在一起成为一句代码,这样不仅可以增强代码的可读性,而且每次链接,都是对对象的属性和状态进行一次操作和变化。

无论后台语言,还是前端开发,现在很多很多写法已经发生了变化,更多的是链式写法——即,上一个函数结果直接作为下一个方法的起点或者变量带入执行,本文将简单罗列出不同语言的链式写法,权当一次总结。

在 Laravel 5.3 开始引入了 tap 全局函数

传入 value 值,并对 value 值进行操作,最后再返回 value。tap 函数就好将 value 值进行镀金,修改 value 对象的状态和属性,最后返回结果可以进行后续操作。如:

update([
    "name" => $name,
    "age" => $age,
]);

当我们传入一个$usermodel 到 tap 方法后,我们就可以链式各种 Model函数,正常情况下,update 方法返回的是 boolean 类型,正因为我们用了 tap 函数,update 方法返回的是 user model 对象,可以继续链式 Model 方法,操作 user 模型对象。

其实在写一些第三方插件时,我们通常也采用链式的套路和写法,如 PHP 中的魔术方法 __call():

public function __call($method, $args)
{
    $map = [
        "template" => "template_id",
        "templateId" => "template_id",
        "uses" => "template_id",
        "to" => "touser",
        "receiver" => "touser",
        "color" => "topcolor",
        "topColor" => "topcolor",
        "url" => "url",
        "miniprogram" => "miniprogram",
        "link" => "url",
        "data" => "data",
        "with" => "data",
    ];
    
    if (0 === stripos($method, "with") && strlen($method) > 4) {
        $method = lcfirst(substr($method, 4));
    }
    
    if (0 === stripos($method, "and")) {
        $method = lcfirst(substr($method, 3));
    }
    
    if (isset($map[$method])) {
        $this->message[$map[$method]] = array_shift($args);
    }
    
    return $this;
}

有了这个魔法方法,链式写法就很有感觉了:

yield $this->bnotice
    ->template($templateid)
    ->to($v)
    ->url($url)
    ->data($data)
    ->request();
在 Promise 中链式写法也很常用

ES6 Promise 中,promises的真正强大之处在于多重的链接,当调用promise.then(func)时返回一个新的 promise,它不会执行直到上一个完成。

只要条件允许,你可以一直then()下去,如

gulp 链式写法

gulp 是目前最火的前端构建工具之一,在 npm 上也是最火的工具之一。它的出现让前端开发变得十分方便。它和 webpack 不太一样,它属于流式处理文件,简单清晰。其中gulp.pipe()处理流程是将上一步的输出作为下一步的输入:

Glide 链式写法

Glide,一个被google所推荐的图片加载库。当我写 Android 代码时,我很喜欢这种链式的写法:

Masonry 链式写法

在 iOS 开发时,使用 masonry 框架实现自动布局时,链式写法也很常见:

// 设置约束
[demoView mas_makeConstraints:^(MASConstraintMaker *make) {

    // 设置顶部的约束 距self.view顶部为100
    make.top.equalTo(self.view).offset(100);
    
    // 设置左边的约束
    make.left.equalTo(self.view).offset(20);
    
    // 设置右边的约束
    make.right.equalTo(self.view).offset(-20);
    
    // 设置高
    make.height.equalTo(@50);

}];
总结

本文只是简单罗列出一些链式写法,无论是后台语言,前端语言,工具,还是 Android、iOS 开发,这种链式写法已经得到很多开发者的推崇。

这种链式规则都是:将对象传入每个方法函数中进行逻辑处理,然后返回该对象,然后再进入下一个方法中,周而复始,此时改变的是这个对象的属性和对象。

就好比一个人不断进入不同的环境进行磨炼——进入一个环境磨炼自己,然后离开,然后再进入下一个环境继续镀金,最后返回自己,但此时的【自己】已经通过不同的【环境】得以锻炼,变成不一样的自己~~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25704.html

相关文章

  • Javascript异步编程 - 函数式编程 - Javascript核心

    摘要:不少第三方模块并没有做到异步调用,却装作支持回调,堆栈的风险就更大。我们可以编写一个高阶函数,让传入的函数顺序执行还是我们之前的例子看起来还是很不错的,简洁并且清晰,最终的代码量也没有增加。 原文: http://pij.robinqu.me/JavaScript_Core/Functional_JavaScript/Async_Programing_In_JavaScript....

    hlcc 评论0 收藏0
  • js学习之异步处理

    摘要:学习开发,无论是前端开发还是都避免不了要接触异步编程这个问题就和其它大多数以多线程同步为主的编程语言不同的主要设计是单线程异步模型。由于异步编程可以实现非阻塞的调用效果,引入异步编程自然就是顺理成章的事情了。 学习js开发,无论是前端开发还是node.js,都避免不了要接触异步编程这个问题,就和其它大多数以多线程同步为主的编程语言不同,js的主要设计是单线程异步模型。正因为js天生的与...

    VioletJack 评论0 收藏0
  • 浅析JavaScript异步

    摘要:回调函数,一般在同步情境下是最后执行的,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。同步方式请求异步同步请求当请求开始发送时,浏览器事件线程通知主线程,让线程发送数据请求,主线程收到 一直以来都知道JavaScript是一门单线程语言,在笔试过程中不断的遇到一些输出结果的问题,考量的是对异步编程掌握情况。一般被问到异步的时候脑子里第一反应就是Ajax,setTimse...

    Tangpj 评论0 收藏0
  • js来聊聊异步编程

    摘要:实例生成以后,可以用方法分别指定状态和状态的回调函数处理返回的结果。 文章的目的 揭开go的 gorouter,c#的 async/await等 使用同步的写法写异步代码的神秘面纱 , 证明其本质就是一个语法糖 为什么使用js来讲异步编程 因为js可以通过编程语言自己的语法特性,实现async/await语法 js异步最底层写法promise const promise = new P...

    huashiou 评论0 收藏0

发表评论

0条评论

chaosx110

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<