函数之美2:不传参之弊

22 阅读2分钟
import { curry, pipe } from 'ramda'

const arr = [1, 2, 3, 4, 5]

// 这里的参数名其实不太好写 还能看得懂 如果有一天它100行的时候 可能就成了一堵墙
const getEvenFromTwo = () => {
    return arr
        .filter((num) => num % 2 === 0)
        .filter((num) => num > 2)
}

// 显而易见不传参很爽,但是有一个问题就是会影响你的思考方式
// 不能将大问题拆分成独立的小问题的能力,其实这是一个很重要的能力

// 改写一下 现在代码还相对清晰 
const getEvenFromTwo = (arr) => {
    return arr
        .filter((num) => num % 2 === 0)
        .filter((num) => num > 2)
}

// 将大问题拆分成独立的小问题的能力

const isEven = (num) => num % 2 === 0

const isAbove2 = (num) => num > 2

// 再写一下
const getEvenFromTwo = (arr) => {
    return arr
        .filter(isEven)
        .filter(isAbove2)
}

// 这样就相对清晰了

// 但是这时候可能有兄弟说了 那我大于3呢?大于4呢?

// 这时候我们就可以将大于2这个条件抽象成一个函数
const isAbove = curry((base, num) => {
    return num > base
})

const isAbove2 = isAbove(2)
const isAbove3 = isAbove(3)
const isAbove4 = isAbove(4)

// 这样我们就可以传参了 但是难道哪一个问题我都这样处理我不累吗
// 活在当下 我们不用处理之前的 只解决现在的问题
// 同样这些小函数我真的用得着嘛 其实未必二次用的 是一种思维方式 拆解问题的思维能力
// 这不就是面向拓展编程嘛 当然 仁者见仁智者见智

// 当参数名不太好写的时候就可以用pipe pipe就是流水线 
// 其实就是函数的组合
// 你可以把pipe想象成一个函数 这个函数接受一个参数 然后返回一个值
// 这个值会被传递给下一个函数 直到最后一个函数 返回最终结果
// 将大问题拆分小问题 将过程抽象成为小函数 至少能看懂数据流转的过程 相对能看懂意图
const getEvenFromTwo = pipe(
    (arr) => arr.filter(isEven),
    (arr) => arr.filter(isAbove2)
)

// 工具就在那 需要我们自己去发现使用的方法 一开始不得其要 说明还需要更多的使用