如何优雅的链式取值之 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 函子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端图片canvas,file,blob
- 下一篇: 在vscode使用editorconfi