日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何优雅的链式取值之 MayBe 函子

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何优雅的链式取值之 MayBe 函子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文基于 如何優雅地鏈式取值

可能有人之前看過我寫的關于函數式編程的東西,也有人看過這一篇文章。由于我還是學生,開發經驗相對較少,所以對于函數式編程如何應用存在一些疑惑。之前也問過面試官,說是實際開發中用的比較少,因為別人可能需要通讀你的代碼才能明白你寫的東西。但是這篇文章就提供給了我一個很好的應用函數式編程的機會。

從 如何優雅地鏈式取值 這篇文章的描述中,可以看出處理嵌套層級特別深的代碼經常會由于數據的原因而出一些錯。例如下面呢這種數據

const res = {data:{oneGoods:{lists:[{price: 1,name:'apple'}]},antherGoods:{lists:[{price: 2}]}} }

假設我們想對 oneGoods 里面的 lists 中的商品的 name 進行操作,我們可以這么寫

res.data.oneGoods.lists[0].name.toUpperCase() // APPLE

那么問題就來了,假設 name 不存在呢,這就會報錯,導致程序終止。例如

res.data.antherGoods.lists[0].name.toUpperCase() // Cannot read property 'toUpperCase' of undefined

或者再極端一點,lists 中沒有那一項

res.data.antherGoods.lists[1].name.toUpperCase() // Cannot read property 'name' of undefined

有哪些方式那篇文章已經說的差不多了,但是有一種沒有提到,就是使用函數式編程的 MayBe 函子。來看看用 MayBe 函子怎么做吧。

其實在 函數式編程之函子 中已經說過了,這里再簡單介紹一下吧。

const MayBe = function(val){this.val = val; }MayBe.of = function(val){return new MayBe(val); }MayBe.prototype.isNothing = function(){return this.val===undefined || this.val===null; }MayBe.prototype.map = function(fn){return this.isNothing() ? MayBe.of(null):MayBe.of(fn(this.val)); }

首先函子是一個實現了 map 方法的普通對象。MayBe 能夠保存任何傳進來的值。MayBe.of 是一個靜態方法,能夠返回一個新的 MayBe 實例。然后它實現了 map 方法,在執行 map 方法時會調用 isNothing 方法進行判斷,如果為 null 或者 undefined 就會返回一個值為 null 的對象。

那么用這個怎么處理之前的鏈式調用呢。

MayBe.of(res).map(res=>res.data).map(data=>data.oneGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[0]).map(list=>list.name).map(name=>name.toUpperCase()) // MayBe {val: "APPLE"} MayBe.of(res).map(res=>res.data).map(data=>data.antherGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[0]).map(list=>list.name).map(name=>name.toUpperCase()) // MayBe {val: null} MayBe.of(res).map(res=>res.data).map(data=>data.antherGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[1]).map(list=>list.name).map(name=>name.toUpperCase()) // MayBe {val: null}

雖然看起來并不簡單,其實邏輯比較簡單,就是代碼多了一點。但是這種鏈式調用的話類似于 promise,所以使用起來特別舒服,而且它把對于錯誤的處理抽象了出來,讓我們無需關系這部分。所以也是一種很好的解決方案。

總歸也找到了函數式編程的一種應用場景,不同的方案有不同的好處,多了解一些東西總能拓寬自己的思路吧。而且那篇文章沒有提到可能是因為沒有想到 MayBe 函子的應用場景,或者不太了解函數式編程,也算是對那篇文章的一個補充吧。希望能引起大家學習函數式編程的興趣?

總結

以上是生活随笔為你收集整理的如何优雅的链式取值之 MayBe 函子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。