摘要:函數(shù)就好將值進行鍍金,修改對象的狀態(tài)和屬性,最后返回結(jié)果可以進行后續(xù)操作。只要條件允許,你可以一直下去,如鏈式寫法是目前最火的前端構(gòu)建工具之一,在上也是最火的工具之一。
鏈式編程或者鏈式寫法,是將多個方法 (函數(shù)) 通過點號 (.) 或者 (->)等符號鏈接在一起成為一句代碼,這樣不僅可以增強代碼的可讀性,而且每次鏈接,都是對對象的屬性和狀態(tài)進行一次操作和變化。
無論后臺語言,還是前端開發(fā),現(xiàn)在很多很多寫法已經(jīng)發(fā)生了變化,更多的是鏈式寫法——即,上一個函數(shù)結(jié)果直接作為下一個方法的起點或者變量帶入執(zhí)行,本文將簡單羅列出不同語言的鏈式寫法,權(quán)當(dāng)一次總結(jié)。
在 Laravel 5.3 開始引入了 tap 全局函數(shù)傳入 value 值,并對 value 值進行操作,最后再返回 value。tap 函數(shù)就好將 value 值進行鍍金,修改 value 對象的狀態(tài)和屬性,最后返回結(jié)果可以進行后續(xù)操作。如:
update([ "name" => $name, "age" => $age, ]);當(dāng)我們傳入一個$usermodel 到 tap 方法后,我們就可以鏈式各種 Model函數(shù),正常情況下,update 方法返回的是 boolean 類型,正因為我們用了 tap 函數(shù),update 方法返回的是 user model 對象,可以繼續(xù)鏈式 Model 方法,操作 user 模型對象。
其實在寫一些第三方插件時,我們通常也采用鏈式的套路和寫法,如 PHP 中的魔術(shù)方法 __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的真正強大之處在于多重的鏈接,當(dāng)調(diào)用promise.then(func)時返回一個新的 promise,它不會執(zhí)行直到上一個完成。
gulp 鏈式寫法
只要條件允許,你可以一直then()下去,如gulp 是目前最火的前端構(gòu)建工具之一,在 npm 上也是最火的工具之一。它的出現(xiàn)讓前端開發(fā)變得十分方便。它和 webpack 不太一樣,它屬于流式處理文件,簡單清晰。其中g(shù)ulp.pipe()處理流程是將上一步的輸出作為下一步的輸入:
Glide 鏈式寫法Glide,一個被google所推薦的圖片加載庫。當(dāng)我寫 Android 代碼時,我很喜歡這種鏈式的寫法:
Masonry 鏈式寫法在 iOS 開發(fā)時,使用 masonry 框架實現(xiàn)自動布局時,鏈式寫法也很常見:
// 設(shè)置約束 [demoView mas_makeConstraints:^(MASConstraintMaker *make) { // 設(shè)置頂部的約束 距self.view頂部為100 make.top.equalTo(self.view).offset(100); // 設(shè)置左邊的約束 make.left.equalTo(self.view).offset(20); // 設(shè)置右邊的約束 make.right.equalTo(self.view).offset(-20); // 設(shè)置高 make.height.equalTo(@50); }];總結(jié)本文只是簡單羅列出一些鏈式寫法,無論是后臺語言,前端語言,工具,還是 Android、iOS 開發(fā),這種鏈式寫法已經(jīng)得到很多開發(fā)者的推崇。
這種鏈式規(guī)則都是:將對象傳入每個方法函數(shù)中進行邏輯處理,然后返回該對象,然后再進入下一個方法中,周而復(fù)始,此時改變的是這個對象的屬性和對象。
就好比一個人不斷進入不同的環(huán)境進行磨煉——進入一個環(huán)境磨煉自己,然后離開,然后再進入下一個環(huán)境繼續(xù)鍍金,最后返回自己,但此時的【自己】已經(jīng)通過不同的【環(huán)境】得以鍛煉,變成不一樣的自己~~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25704.html
摘要:不少第三方模塊并沒有做到異步調(diào)用,卻裝作支持回調(diào),堆棧的風(fēng)險就更大。我們可以編寫一個高階函數(shù),讓傳入的函數(shù)順序執(zhí)行還是我們之前的例子看起來還是很不錯的,簡潔并且清晰,最終的代碼量也沒有增加。 原文: http://pij.robinqu.me/JavaScript_Core/Functional_JavaScript/Async_Programing_In_JavaScript....
摘要:學(xué)習(xí)開發(fā),無論是前端開發(fā)還是都避免不了要接觸異步編程這個問題就和其它大多數(shù)以多線程同步為主的編程語言不同的主要設(shè)計是單線程異步模型。由于異步編程可以實現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開發(fā),無論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個問題,就和其它大多數(shù)以多線程同步為主的編程語言不同,js的主要設(shè)計是單線程異步模型。正因為js天生的與...
摘要:回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行,因為事件沒有被觸發(fā)或者條件不滿足。同步方式請求異步同步請求當(dāng)請求開始發(fā)送時,瀏覽器事件線程通知主線程,讓線程發(fā)送數(shù)據(jù)請求,主線程收到 一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結(jié)果的問題,考量的是對異步編程掌握情況。一般被問到異步的時候腦子里第一反應(yīng)就是Ajax,setTimse...
摘要:實例生成以后,可以用方法分別指定狀態(tài)和狀態(tài)的回調(diào)函數(shù)處理返回的結(jié)果。 文章的目的 揭開go的 gorouter,c#的 async/await等 使用同步的寫法寫異步代碼的神秘面紗 , 證明其本質(zhì)就是一個語法糖 為什么使用js來講異步編程 因為js可以通過編程語言自己的語法特性,實現(xiàn)async/await語法 js異步最底層寫法promise const promise = new P...
閱讀 384·2023-04-25 16:38
閱讀 1497·2021-09-26 09:46
閱讀 3344·2021-09-08 09:35
閱讀 2793·2019-08-30 12:54
閱讀 3261·2019-08-29 17:06
閱讀 1032·2019-08-29 14:06
閱讀 3356·2019-08-29 13:00
閱讀 3473·2019-08-28 17:53