純函數(shù)和非純函數(shù)

2018-02-24 15:59 更新

純函數(shù)(Pure Function)是這樣一種函數(shù)——輸入輸出數(shù)據(jù)流全是顯式(Explicit)的。
顯式(Explicit)的意思是,函數(shù)與外界交換數(shù)據(jù)只有一個(gè)唯一渠道——參數(shù)和返回值;函數(shù)從函數(shù)外部接受的所有輸入信息都通過(guò)參數(shù)傳遞到該函數(shù)內(nèi)部;函數(shù)輸出到函數(shù)外部的所有信息都通過(guò)返回值傳遞到該函數(shù)外部。

如果一個(gè)函數(shù)通過(guò)隱式(Implicit)方式,從外界獲取數(shù)據(jù),或者向外部輸出數(shù)據(jù),那么,該函數(shù)就不是純函數(shù),叫作非純函數(shù)(Impure Function)。
隱式(Implicit)的意思是,函數(shù)通過(guò)參數(shù)和返回值以外的渠道,和外界進(jìn)行數(shù)據(jù)交換。比如,讀取全局變量,修改全局變量,都叫作以隱式的方式和外界進(jìn)行數(shù)據(jù)交換;比如,利用I/O API(輸入輸出系統(tǒng)函數(shù)庫(kù))讀取配置文件,或者輸出到文件,打印到屏幕,都叫做隱式的方式和外界進(jìn)行數(shù)據(jù)交換。

//一些例子
//純函數(shù)
def add(a:Int,b:Int) = a + b
//非純函數(shù)
var a = 1
def addA(b:Int) = a + b

def add(a:Int,b:Int) = {
  println(s"a:$a b:$b")
  a + b
}
def randInt() = Random.nextInt()

純函數(shù)的好處(來(lái)自維基百科)

  • 無(wú)狀態(tài),線程安全,不需要線程同步.
  • 純函數(shù)相互調(diào)用組裝起來(lái)的函數(shù),還是純函數(shù).
  • 應(yīng)用程序或者運(yùn)行環(huán)境(Runtime)可以對(duì)純函數(shù)的運(yùn)算結(jié)果進(jìn)行緩存,運(yùn)算加快速度.

純函數(shù)的好處(來(lái)自我的經(jīng)驗(yàn))

  • 單元測(cè)試非常方便!
  • 分布式/并發(fā)環(huán)境下,斷點(diǎn)調(diào)試的方式無(wú)以為繼,你需要單元測(cè)試.

單元測(cè)試什么的,趕緊去?http://www.scalatest.org?試試吧

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)