浅谈柯里化

2023-02-27 16:54:43 浏览数 (2)

浅谈柯里化 http://zoo.zhengcaiyun.cn/blog/article/currying

背景:

在 react 项目中使用 antd 表单的时候,遇到一些老项目,需要校验密码的强弱、校验输入的规则等,如果每次都是传正则和需要校验的字符串,有点麻烦。

代码语言:javascript复制
import React from "react";

const accountReg = /^[a-zA-Z0-9_-]{4,16}$/;
const passwordReg = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?d)(?=.*?[!@#$])[a-zA-Zd!@#$]{10,16}$/;

const FormCom = () => {

  const checkReg = (reg, txt) => {
    return reg.test(txt)
  }
  
  //账号
  const checkAccount = (event) => {
    checkReg(accountReg, event.target.value);
    // 其他逻辑
  };

  //密码
  const checkPassword = (event) => {
    checkReg(passwordReg, event.target.value);
    // 其他逻辑
  };
 
  ...
  // 省去其他函数校验
  
  render() {
    return (
      <form>
        账号:
        <input onChange={checkAccount} type="text" name="account" />
        密码:
        <input onChange={checkPassword} type="password" name="password" />
      </form>
    );
  }
}

export default FormCom;

我们怎么解决类似的问题呢,我们可以使用柯里化函数来解决类似的问题。当然属于个人观点,如果其他方法,欢迎提出,进行学习

代码语言:javascript复制
import React from "react";

const accountReg = /^[a-zA-Z0-9_-]{4,16}$/;
const passwordReg = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?d)(?=.*?[!@#$])[a-zA-Zd!@#$]{10,16}$/;

const FormCom = () => {
  
  // 柯里化封装
  const curryCheck = (reg) => {
    return function(txt) {
        return reg.test(txt)
    }
  }

  //账号,这样就省去了一个参数的传递
  const checkAccount = curryCheck(accountReg);

  //密码,这样就省去了一个参数的传递
  const checkPassword = curryCheck(passwordReg);

  const checkAccountFn = () => {
    checkAccount(event.target.value);
    // 其他逻辑
  }
 
  const passwordFn = (event) => {
    checkPassword(event.target.value);
    // 其他逻辑
  };
  
  ...
  // 省去其他函数校验

  render() {
    return (
      <form>
        账号:
        <input onChange={checkAccountFn} type="text" name="account" />
        密码:
        <input onChange={passwordFn} type="password" name="password" />
      </form>
    );
  }
}

export default FormCom;
一、柯里化

在计算机科学中,柯里化(英语:Currying ),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是 Moses Schönfinkel 和戈特洛布·弗雷格发明的。柯里化其实也是函数式编程的思想。下面来举例说明什么是柯里化呢?

下面例子求和的过程,就是一个“乞丐版”的柯里化的过程

代码语言:javascript复制
  const addFn = (x, y, z) => {
    return x   y   z;
  };

  const addResultFn = addFn(1, 2, 3);
  console.log("


	

0 人点赞