代码组合

代码组合

函数式编程的代码组合的基本形式和原理分别是什么?poinfree 模式是什么?

2018-08-31侠课岛    中级进阶       

前端/前端/ES6函数式编程 6     0     1398

函数式编程是一种编程范式,主要是把运算过程拆分成各个函数,然后通过把各个函数封装链接起来去处理数据。随着业务需求数据量的增加,函数代码嵌套会越来越多,代码的可读性和可维护性会不断下降。所以提出了函数式编程的方式,把每个流程都用一元函数的方式来代表,然后把处理小逻辑的函数组合成整个程序流程,代码组合(compose)就是其中一种比较简单的方式,把简单的、通用的函数组建起复杂的函数。

先定义一个 compose 函数,用于把多个函数拼接起来运行,它可以接收多个数据类型是函数的输入参数,然后返回一个新的函数,给该函数传递参数时,compose 函数会对该参数依次执行它接受的函数参数,并把前一个函数的返回结果作为后一个函数的输入参数依次执行,直到最后返回结果。

const compose = (f1, f2) => {
  return function(args) {
    return f1(f2(args))
  }
}

// es6
const _compose = (f1, f2) => (agrs => f1(f2(args)))

上面代码中 compose 就是代码组合的基本形式和原理,先定义接收的参数(函数),然后通过 args 把多个原没有关联并各自独立的输入参数(函数)链接起来并返回一个新的函数,根据 compose 可以看出,f2 是在 f1 之前执行的,所以说 compose 运行时,数据流是从右到左传递的,上一个函数执行完毕之后,会把返回值作为下一个函数的参数传入,而且每个函数都是独立且只有一个输入参数,作为数据的流动入口。

当然,基本思路就是通过数据把函数组合起来,下面举个例子,从身份证中获取生日,并用不同的格式展示

const getBirthdayFromIdCard = (idCard) => {
  let birthday = ""
  if (idCard != null && idCard != "") {
    if (idCard.length == 15) {
      birthday = `19${idCard.substr(6, 6)}`
    } else if (idCard.length == 18) {
      birthday = idCard.substr(6, 8)
    }
  }
  return birthday
}

const format1 = (date) => {
   return date.replace(/(.{4})(.{2})/, "$1-$2-")
}

const format2 = (date) => {
    return date.replace(/(.{4})(.{2})(.{2})/, "$1年$2月$3日")
}

const compose = (f1, f2) => {
    return function(args){
        return f1(f2(args))
    }
}
const formatDate1 = compose(format1, getBirthdayFromIdCard) 
const formatDate2 = compose(format2, getBirthdayFromIdCard)

formatDate1('340321193412023567') // 1934-12-02
formatDate2('340321193412023567') // 1934年12月02日

可以看到,代码组合(compose)通过将不同 format1format2 两个高阶函数进行组合,并返回一个全新的函数,以满足业务需求,同时,通过不同的组合方式,可以得到不同的结果,这风格就是函数式编程,通过把已有的函数进行组合得出新的函数,来达到复用代码的目的。

这里定义的 compose 函数固定了两个参数,不够通用且不具备普遍意义,可以改写它,使它具有通用性。由于代码组合过程中数据交互的方式是把上一次执行的结果传给下一次执行,根据这点,可以使用 Array.prototype.reduce() 来改写,使其可以更加通用,提高复用性。

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

6

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?