函數式編程我的感悟

函數式編程感悟是聲明式編程,與命令式編程相對,其典型應用爲SQL語句。爲了清晰描述這個問題,我作了以下的場景比較:算法

 

咱們知道SQL Server 由數據文件和檢索引擎組成,當用戶客戶端須要檢索一個學生,名字爲tom時,怎將Sql語句「select id, name from student where name ='tom'」傳遞個檢索引擎便可。咱們修改table student, 增長一個age字段,這時咱們檢索age大於18的學生,則只需將sql語句「select id, name from student where age>18」傳遞給檢索引擎便可。sql

 

假設咱們的學生信息不是存放在SQL Server中,而是存在一個文本文件中,咱們要手動開發一個學生信息檢索引擎供客戶端使用。express

當用戶客戶端須要檢索一個學生,咱們在引擎中定義方法:編程

public List<Student>GetStudentByName(string name){分佈式

//...函數式編程

}函數

而後客戶端再調用;咱們修改 student, 增長一個age字段,這時咱們檢索age大於18的學生,怎須要在引擎新加一個方法:spa

public List<Student>GetStudentGreaterAge(int age){索引

//...接口

}

 

比較兩個事例,發現主要區別是,在引擎學生信息變化時,sql引擎沒有變化,而咱們寫的學生信息檢索引擎的變化了,增長了一個接口。從而說明在應對變化是函數式編程更有優點。

 

下面咱們利用Lambda expression實現函數式編程引擎:

在引擎中定義以下方法:

public List<Student> GetStudents(Expression<Func<Student, Boolean>>){

//...

}

這樣咱們能夠將查詢條件經過lambda表達式傳遞,屏蔽了查詢接口的變化。

在這裏我強調的是接口變化,而不是實現變化。也許有人會問,給student增長一個字段age後,那麼方法GetStudents(Expression<Func<Student, Boolean>>)是須要改變來從文本中獲取age字段的,這是確定的。但咱們也可由在不改變此方法來實現這一變化,及經過一點的規則將age動態解析到GetStudents(Expression<Func<Student, Boolean>>)方法中。

 

 

總結:

  1. 函數式編程傳遞的是算法,命令是編程傳遞的是實體數據;
  2. 函數式編程特別適合分佈式系統,由於算法的數據量很小,而實體數據的數據量很大(典型應用,MongoDB
相關文章
相關標籤/搜索