什么是函數式編程
簡單地說,函數式編程通過使用函數,將值轉換成抽象單元,接著用于構建軟件系統。
面向對象VS函數式編程
面向對象編程
面向對象編程認為一切事物皆對象,將現實世界的事物抽象成對象,現實世界中的關系抽象成類、繼承,幫助人們實現對現實世界的抽象和數字建模。面向對象編程有三個特征,分別是封裝,繼承和多態。面向對象的主要目標是問題的分解,如下圖所示:
函數式編程
函數式編程以函數為抽象單元和行為單元,實現數據的封裝和隱藏,與面向對象將問題分解成多組“名詞”或對象不同,函數式方法將相同的問題分解成多組“動詞”或函數。函數式編程也可以通過組合來構造更大的函數,實現抽象的行為。如下圖所示:一種函數式的部件組成一個完整的系統的方法,就是取一個“值”,然后將它逐漸“改變”,通過一個原始的或者組合的函數,成為另外一個值。
兩者差異
在一個面向對象的系統內部,對象之間的交互會引起各種對象內部狀態的變化,而整個系統的變化是由許多小的,細微的變化混合形成的,這些相互關聯的狀態變化形成了一個概念上的“變化網”。但我們需要跟蹤這邊變化的時候,就需要了解彼此之間這種微妙且廣泛的變化。
相比之下,函數式系統則努力減少可見狀態的修改。向一個遵循函數式的系統添加新功能就成了理解如何在局限的上下文環境中,無破壞地進行數據轉換。函數式編程以命令的方式構建系統,并通過顯性的狀態來改變縮減到最小來變得更加模塊化。
例子
function demo{ return function(array){return fun.apply(null,array);//返回一個函數}}
總結
總的來說,函數式編程包括以下四個方面:
- 確定抽象函數,并為其構造函數
- 利用已有的函數來構造更為復雜的函數
- 通過將函數傳給其他的函數來構建更為復雜的抽象。