浅析函数式编程

/**
 *               ii.                                         ;9ABH,
 *              SA391,                                    .r9GG35&G
 *              &#ii13Gh;                               i3X31i;:,rB1
 *              iMs,:,i5895,                         .5G91:,:;:s1:8A
 *               33::::,,;5G5,                     ,58Si,,:::,sHX;iH1
 *                Sr.,:;rs13BBX35hh11511h5Shhh5S3GAXS:.,,::,,1AG3i,GG
 *                .G51S511sr;;iiiishS8G89Shsrrsh59S;.,,,,,..5A85Si,h8
 *               :SB9s:,............................,,,.,,,SASh53h,1G.
 *            .r18S;..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....,,.1H315199,rX,
 *          ;S89s,..,,,,,,,,,,,,,,,,,,,,,,,....,,.......,,,;r1ShS8,;Xi
 *        i55s:.........,,,,,,,,,,,,,,,,.,,,......,.....,,....r9&5.:X1
 *       59;.....,.     .,,,,,,,,,,,...        .............,..:1;.:&s
 *      s8,..;53S5S3s.   .,,,,,,,.,..      i15S5h1:.........,,,..,,:99
 *      93.:39s:rSGB@A;  ..,,,,.....    .SG3hhh9G&BGi..,,,,,,,,,,,,.,83
 *      G5.G8  9#@@@@@X. .,,,,,,.....  iA9,.S&B###@@Mr...,,,,,,,,..,.;Xh
 *      Gs.X8 S@@@@@@@B:..,,,,,,,,,,. rA1 ,A@@@@@@@@@H:........,,,,,,.iX:
 *     ;9. ,8A#@@@@@@#5,.,,,,,,,,,... 9A. 8@@@@@@@@@@M;    ....,,,,,,,,S8
 *     X3    iS8XAHH8s.,,,,,,,,,,...,..58hH@@@@@@@@@Hs       ...,,,,,,,:Gs
 *    r8,        ,,,...,,,,,,,,,,.....  ,h8XABMMHX3r.          .,,,,,,,.rX:
 *   :9, .    .:,..,:;;;::,.,,,,,..          .,,.               ..,,,,,,.59
 *  .Si      ,:.i8HBMMMMMB&5,....                    .            .,,,,,.sMr
 *  SS       :: h@@@@@@@@@@#; .                     ...  .         ..,,,,iM5
 *  91  .    ;:.,1&@@@@@@MXs.                            .          .,,:,:&S
 *  hS ....  .:;,,,i3MMS1;..,..... .  .     ...                     ..,:,.99
 *  ,8; ..... .,:,..,8Ms:;,,,...                                     .,::.83
 *   s&: ....  .sS553B@@HX3s;,.    .,;13h.                            .:::&1
 *    SXr  .  ...;s3G99XA&X88Shss11155hi.                             ,;:h&,
 *     iH8:  . ..   ,;iiii;,::,,,,,.                                 .;irHA
 *      ,8X5;   .     .......                                       ,;iihS8Gi
 *         1831,                                                 .,;irrrrrs&@
 *           ;5A8r.                                            .:;iiiiirrss1H
 *             :X@H3s.......                                .,:;iii;iiiiirsrh
 *              r#h:;,...,,.. .,,:;;;;;:::,...              .:;;;;;;iiiirrss1
 *             ,M8 ..,....,.....,,::::::,,...         .     .,;;;iiiiiirss11h
 *             8B;.,,,,,,,.,.....          .           ..   .:;;;;iirrsss111h
 *            i@5,:::,,,,,,,,.... .                   . .:::;;;;;irrrss111111
 *            9Bi,:,,,,......                        ..r91;;;;;iirrsss1ss1111
 */

函数式编程


函数式编程也是一种编程范式,其核心是尽量做到用 Pure Function纯函数来编程,主要的好处是,解耦。

(1) 纯函数 Pure Function

纯函数有以下两个特点:

  • 函数不会产生 Side Effect ,没有副作用
  • 函数满足 Referential Transparency ,引用透明
No Side Effect

函数调用后,只会影响函数内部的状态而不会对外部产生影响
一个符合No Side Effect的函数如下:

public static int add(int a, int b) {
    return a + b;
}

内部只用到了传入的参数,并且不对外部的变量有影响,符合:No Side Effect,那么不符合的函数有吗?

static int sum = 0;
public static int add(int a, int b) {
    sum += a;
    return a + b;
}

内部对非传入参数,外部的变量:sum进行了操作,每执行此函数都会污染一次外部的变量 sum,因而看来其就是一个非纯函数。

Referential Transparency

函数引用透明,透明不是指函数的内部实现是透明,而是引用。每一次的引用,每一次的调用函数,固定的输入的输出一定是透明的,即有固定的输出。
举个一个不符合引用透明的例子:

static int sum = 0;
public static int sum(int a, int b) {
    return sum += a + b;
}

如果符合,则传入参数一定,不论什么时候其结果是透明,结果是唯一的:

public static void main(String[] args) {
    System.out.println(sum(1,2));
    System.out.println(sum(1,2));
}
//输出:
3
6

看见,同样的输入在不同情况下得到的结果不一致,这就很可怕了,非透明的函数,究其根本还是对函数外部的变量有勾结,即有耦合。


(2) 函数式编程,Functional Programming

  • 说了这么多,纯函数无非就是满足上面的两个特性的函数,最大的特点是内部是纯洁干净没有对外界产生影响。

  • 在我看来,其核心或者说是目的就是解耦,让你的函数纯洁起来,这样做会有什么好处吗?当然有,譬如说在一个View页面中,你一个方法的内部依赖了很多外部的控件实体,需要外部很多的变量一起协作,但是你没有通过参数的形式传入,而是直接使用,也就是一个非纯函数,当你发现别的View中也需要用到这个方法,于是你直接copy了过去,于是乎就一堆红色报错找不到各种对象,令人抓狂。

  • 纯函数好比一个一个最小的模块,何为模块,当然有很多的特性,但最大的是其可以任意移动拼接和组合,要做到这点,势必要解耦。

  • Functional Programming,编程规范,不遵循也一样可以实现功能满足需求,但后面的变化和改动就不怎么好做了,所以,尽量地,去遵行这个范式吧~

你可能感兴趣的:(浅析函数式编程)