淺析函數式編程

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容