1. 程式人生 > >函數語言程式設計及響應式程式設計之己見

函數語言程式設計及響應式程式設計之己見

1. what is 函數語言程式設計?

函式,在程式設計中,通常體現為: 輸入 => 執行 => 結果。他不是命令式的,而是對一段操作進行邏輯封裝,拿到輸入,就能產出結果。通常來說,滿足函數語言程式設計的特性的“函式”應該有如下特點:

  • 函式必須有入參,並且函式的產出會根據入參的不同而變化。
  • 函式執行的整個流程中,不會對全域性變數、外部屬性等產生影響。
  • 函數語言程式設計程式碼量小,乾淨。

舉個例子:

var arr = [1,2,3,4,5];

function addOne (array) {

    for(var i=0;i<array.length;i++){
        array[i] += 1;
    }

    return array;
}

addOne(arr); // 2,3,4,5,6

寫了一個方法,接受一個數組,產出陣列每個成員+1,但這段程式碼的不足之處在於:

  • 難以複用,如果需求提出 addTwo,addThree方法,需要不斷修改函式名和內部邏輯。
  • 內部的程式碼很囉嗦, for 迴圈很low。

·函數語言程式設計改進版:

let arr = [1,2,3,4,5];
arr.map(item=> item+1); // 3,4,5,6,7

 

這裡,改進使用了原生的 Array.prototype.map 方法,程式碼量縮小了很多不說,而且複用性進一步提升。整個函式做的事情現在非常直觀,入參 => 每項引數 + 1 => 返回新陣列,由此,可以說,map()方法是一個純函式(pure function)。

2. 響應式程式設計

前端中也有一個概念叫響應式,bootstrap 。這裡當然說的不是這個,對於響應式程式設計的概念,我想提及Vue或者 angular的雙向繫結來闡述:

// template: 

i'am {{ name }}

// js:

name = 'jhon';

在前端MVVM的框架中,都有一個數據雙向繫結的概念,這裡的模版中的變數,實時反映了資料中的 name 變數的 value,而且,如果此時我修改了 name 的值,那麼模版中對應的值也會跟著修改。資料 <=> 檢視 是同時發生,同時改變的,因為模版就是對資料的一個對映。

再舉個例子:

c的值,是通過 a + b 來賦值的,如果ab不是固定的,而是變化的值,那麼 c 的值也不會固定為3。 

let a = 1,b=2;

let c = a + b; // 3

不難看出,響應式程式設計特點:

  •  同步發生,結果會隨著修改引數而實時、動態地變化。
  • 存在固定的對映關係。