/**
* 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,编程规范,不遵循也一样可以实现功能满足需求,但后面的变化和改动就不怎么好做了,所以,尽量地,去遵行这个范式吧~