/**
* 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,編程規范,不遵循也一樣可以實現功能滿足需求,但后面的變化和改動就不怎么好做了,所以,盡量地,去遵行這個范式吧~