美文网首页
函数式编程就是定义过程

函数式编程就是定义过程

作者: _我和你一样 | 来源:发表于2017-12-06 22:07 被阅读0次

    函数式编程:

    函数式编程是一种编程范式programming paradigm),也就是如何编写程序的方法论。它属于结构化编程的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

    比如:实现 先加1 再加2 的运算 先运算一个函数将其结果作为另一个函数的参数。定义成过程就是如下的add函数。

    function addOne(x) {
        return x+1;
    }
    
    function addTwo(x) {
        return x+2;
    }
    
    // 函数式编程就是定义过程 定义过程还有一个说法叫做预加载 先给个参数 先加载出一个函数
    function add(f,g) {
        return function (x) {
           return f(g(x));//先执行哪个,我们默认先执行右边那个。虽然 f(g(x)) 和 g(f(x)) 都对,但我们还是返回 f(g(x))
        }
    }
    
    //调用
    var res = add(addOne,addTwo)(1);
    console.log(res);
    //addOne 和 addTwo 的传参数我们并没有显示的调用传参,但是add内部处理了。
    

    我们看express的app.use('/',index)时,也没传什么参数,其实是use函数内部做了很多处理。

    函数式编程的特点

    函数是纯洁的透明的是可移植的 函数的运行不依赖于外部变量或状态,只依赖输入参数。

    一句话解释什么是curry化

    curry化 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数。

    例子:累加器的演进

    普通的自加函数

    function increase1(x) {
        return x+1;
    }
    
    function increase2(x) {
        return x+2;
    }
    

    curry化的自加函数

    function increase(x) {
        return function (y) {
            return x + y;
        }
    }
    

    像普通函数那样,函数不可能无穷尽的定义,是定义不完的,

    由函数生成函数有很多好处:

    var res = increase(1)(2);
    console.log(res);//3
    
    //自增1
    var inc1 = increase(1);
    console.log(inc1(5));//6
    console.log(inc1(9));//10
    
    //自增2
    var inc2 = increase(2);
    console.log(inc2(3));//5
    console.log(inc2(5));//7
    

    做技术,加入别人的团队,首先要学习的就是合作和别人的技术规范。

    函数定义的兼容性处理

    有些函数定义了多个参数,但是传参数很奇怪,参数不够也可以执行,之所以可以执行,是因为函数内部做了还多兼容性处理。比如对参数的判断和重新赋值。这在mongoose的使用中感觉明显。

    //伪代码
    function jianrong(x,y,f) {
        if( f === undefined ){
            f = y
        }
    }
    

    js项目的起始文件应该是什么?

    App.js server.js index.js用的比较多,通常看一眼大家就知道了哪个是入口文件了。比如第三方库 morgan的起始文件就是index.js, cookie-parser的起始文件也是index.js。

    而express架构中的bin/www倒不常用

    引入的第三方库放在哪儿了

    package.js会引入第三方库,引入的第三方库存在node_moudules文件夹下,打开node_moudules文件夹可能会看到好多文件夹,因为你引入的第三方也会引用其他的库。

    查看第三方库的使用方式

    除了看api文档外,我们也可以进入第三方库的index.js文件,找到导出的东西,看看长的是什么样的,如果导出的是一个函数,函数内部返回一个函数,那引入的时候就得调用以下。express的中间件都是返回了一个中间件函数。

    一个易用的加密工具

    md5也不算加密算法,md5(MD5 Message-Digest Algorithm)是一种信息摘要算法,是用于确保信息传输完整一致。

    我们在使用node函数加密时,用的bcryptbcrypt.hashSync(pass,10);返回加密后的密码hash值,后面参数是盐的长度。盐就是随机数,也就是10位长度的随机数。

    加盐加密:

    加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。

    加盐进化史

    相关文章

      网友评论

          本文标题:函数式编程就是定义过程

          本文链接:https://www.haomeiwen.com/subject/faglbxtx.html