鏈式編程

鏈式編程或者鏈式寫法,是將多個方法 (函數) 經過點號 (.) 或者 (->)等符號連接在一塊兒成爲一句代碼,這樣不只能夠加強代碼的可讀性,並且每次連接,都是對對象的屬性和狀態進行一次操做和變化。php

不管後臺語言,仍是前端開發,如今不少不少寫法已經發生了變化,更多的是鏈式寫法——即,上一個函數結果直接做爲下一個方法的起點或者變量帶入執行,本文將簡單羅列出不一樣語言的鏈式寫法,權當一次總結。前端

在 Laravel 5.3 開始引入了 tap 全局函數

<?php
function tap($value, $callback)
{
    $callback($value);
    return $value;
}

傳入 value 值,並對 value 值進行操做,最後再返回 value。tap 函數就好將 value 值進行鍍金,修改 value 對象的狀態和屬性,最後返回結果能夠進行後續操做。如:webpack

<?php
return tap($user)->update([
    'name' => $name,
    'age' => $age,
]);

當咱們傳入一個$usermodel 到 tap 方法後,咱們就能夠鏈式各類 Model函數,正常狀況下,update 方法返回的是 boolean 類型,正由於咱們用了 tap 函數,update 方法返回的是 user model 對象,能夠繼續鏈式 Model 方法,操做 user 模型對象。web

其實在寫一些第三方插件時,咱們一般也採用鏈式的套路和寫法,如 PHP 中的魔術方法 __call():npm

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 鏈式寫法

gulp 是目前最火的前端構建工具之一,在 npm 上也是最火的工具之一。它的出現讓前端開發變得十分方便。它和 webpack 不太同樣,它屬於流式處理文件,簡單清晰。其中gulp.pipe()處理流程是將上一步的輸出做爲下一步的輸入:
promise

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 開發,這種鏈式寫法已經獲得不少開發者的推崇。

這種鏈式規則都是:將對象傳入每一個方法函數中進行邏輯處理,而後返回該對象,而後再進入下一個方法中,周而復始,此時改變的是這個對象的屬性和對象。

就比如一我的不斷進入不一樣的環境進行磨鍊——進入一個環境磨鍊本身,而後離開,而後再進入下一個環境繼續鍍金,最後返回本身,但此時的【本身】已經經過不一樣的【環境】得以鍛鍊,變成不同的本身~~~

開通原創了,恭喜下本身!!!


iOS 打賞做者 關注公衆號


本文分享自微信公衆號 - coding01(coding01)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索