どのように優雅なチェーン式の値を取る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の手紙の応用シーンを思わなかったり、関数式のプログラミングをよく知らなかったりしたからかもしれない.関数式プログラミングの勉強に興味を持ってほしいですか?