【前端进阶】MayBe函子

503 阅读2分钟

MayBe函子

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文同时参与 「掘力星计划」         ,赢取创作大礼包,挑战创作激励金

前言

上一篇的结尾我们说了demo有一些小毛病,在本章节我们会进行一下问题的处理

MayBe函子

  • 我们在编程的过程中可能会遇到很多错误,需要对这些错误做相应的处理
  • Maybe函子的作用就是可以对外部的控制情况做处理(控制副作用在允许的范围)

简单函子:

class MayBe{
    static of(value) {
        return new MayBe(value)
    }
    constructor(value){
        this._value = value
    }
    map(fn){
        return MayBe.of(fn(this._value))
    }
}

我们这样执行会出现一点情况,null和undefined的时候会出现报错的,所以我们要进行一下代码升级

升级2.0版本

辅助函数: 判断是否为空

isNothing() {
    return this._value === null || this._value === undefined
}

修改map函数

map(fn) {
    // 如果不为空或者undefined,正常执行
    return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
}

完整代码

class MayBe{
    static of(value) {
        return new MayBe(value)
    }
    constructor(value){
        this._value = value
    }
    map(fn) {
        // 如果不为空或者undefined,正常执行
        return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
    }
    isNothing() {
        return this._value === null || this._value === undefined
    }
}

测试:

正常输入:

let r = MayBe.of('hello world').map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: 'HELLO WORLD' }

1634048070(1).png 正常输入的时候和我们的预期结果是一样的,但是我们需要测试的nullundefined还没有进行测试 输入null

let r = MayBe.of(null).map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: null }

image.png 测试如我们的预期,没问题 输入undefined

let r = MayBe.of(null).map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: null }

image.png 测试如我们的预期,没问题

个别小问题:

let r = MayBe.of(null).map(x => x.toUpperCse()).map(null).map(x => x.split(' '))
console.log(r) // 输出为:MayBe { _value: null }

虽然我们可以处理空值的问题,但是多次调用map的时候,什么时候出现了空值,我们却不知道,所以就需要一个新的函子了,下一章Either函子见!

下期见.webp