加载中...

纯函数和非纯函数


纯函数(Pure Function)是这样一种函数——输入输出数据流全是显式(Explicit)的。
显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值;函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过返回值传递到该函数外部。

如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么,该函数就不是纯函数,叫作非纯函数(Impure Function)。
隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如,读取全局变量,修改全局变量,都叫作以隐式的方式和外界进行数据交换;比如,利用I/O API(输入输出系统函数库)读取配置文件,或者输出到文件,打印到屏幕,都叫做隐式的方式和外界进行数据交换。

//一些例子
//纯函数
def add(a:Int,b:Int) = a + b
//非纯函数
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()

纯函数的好处(来自维基百科)

  • 无状态,线程安全,不需要线程同步.
  • 纯函数相互调用组装起来的函数,还是纯函数.
  • 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度.

纯函数的好处(来自我的经验)

  • 单元测试非常方便!
  • 分布式/并发环境下,断点调试的方式无以为继,你需要单元测试.

单元测试什么的,赶紧去 http://www.scalatest.org 试试吧


还没有评论.