[科普文] 浅谈 Function Programing 编程范式

2022-09-02 14:11:33 浏览数 (3)

来自团队 「史晓宇」 同学的分享。

背景

设想一个场景,假如需要实现这样两个函数:

  • transform1 :input 一个字符串,output 要全部转成大写并尾部加感叹号修饰;
  • transform2 :input 一个字符串,output 要全部转成小写并尾部加感叹号修饰。

如果按以往命令式编程思维,可能会这么写:

代码语言:javascript复制
const transform1 = (str) => {
  if (typeof str === "string") {
    return `${str.toUpperCase()}!`;
  }
  return "Not a string";
};

const transform2 = (str) => {
  if (typeof str === "string") {
    return `${str.toLowerCase()}!`;
  }
  return "Not a string";
};
transform1("hello world"); // "HELLO WORLD !"
transform2("HELLO WORLD"); // "hello world !"

两个函数虽效果不同,但代码框架极为相似,逻辑冗余且僵硬,比较难实现复用。相对而言,函数式编程思维则会尽量将逻辑抽象拆解为可被复用的若干最小单位,同样的需求可能会这么实现:

代码语言:javascript复制
const { flow } = require("lodash/fp");
const toUpper = (str) => str.toUpperCase();
const toLower = (str) => str.toLowerCase();
const exclaim = (str) => `${str}!`;
const isString = (str) => (typeof str === "string" ? str : "Not a string");
const transform1 = flow(isString, toUpper, exclaim);
const transform2 = flow(isString, toLower, exclaim);
transform1("hello world"); // "HELLO WORLD !"
transform2("HELLO WORLD"); // "hello world !"

刚开始可能觉得没什么必要,但是在中大型项目里尤其好用,因为我们也不知道未来需求会变得多复杂。FP 使用大量的Function,每个function都是一个单一的功能,再按功能需求以特定的方式组合起来,编写时易于复用,在出现bug时也易于快速定位到相关的功能函数,使得代码减少重复、容易理解、容易改变、容易排除错误和具有弹性。

核心概念

FP(Functional Programming)是一种通过简单地组合一组函数来编写程序的风格,它推荐我们将几乎所有东西都包装在函数中,编写大量可重用的小函数,然后简单地一个接一个地调用它们以获得类似的结果:( func1.func2.func3 ) 或以组合方式,例如:func1(func2 (func3()))。总而言之是:一种抽象思维、一种编程风格、一种编程规范。

FP 具有以下特点:

1. Function 为First-class citizen(一等公民)

这个特性意味着函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值,而 js 的function 本来就有这个特性。这也是 FP 得以实现的前提。

2. Declarative Programming(声明式编程)

FP 是 Declarative Programming 的代表,逻辑为用较为抽象的程式码,理解代码想要达到怎样的目标,Function 之间不会互相共用state 状态(着重 what)。而 Imperative Programming (命令式编程)比较容易写出状态互相依赖的代码(着重how)。举个加总 Array

0 人点赞