走进函数式编程 (Becomming Functional) (2)

函数式编程第二式,纯函数 (Pure Functions). 何谓纯函数,纯函数就是数据库的函数一样没有副作用,不修改对象的内部状态,或者说只进行计算。给定什么输入,永远得到相同的输出,即输出只依赖于输入

纯函数有什么好处呢?极其容易测试,只需要给定一组输入,对输出进行断言。如果是带副作用的方法,它修改了某个私有的属性,很难进行状态判定。

Scala 基于统一访问原则,属性与方法不需要那么明晰,所以属性与方法名是不能重名的。它对有无副作用存在这么一个约定:

空括号方法 (empty-paren method), 如 def width() {...} 它是有副作的。这样调用 obj.width()
无参方法 (parameterless method), 如 def width {...}, 它是无副作的。这样调用 obj.width, 这和使用属性一致形式

Java 也有类似的约定,get 开头的或 getter 方法往往是无副作用的。要是有人偏偏在 getName() 方法里修改了对像的属性而引入了 Bug,那只会让人唏嘘不已。

方法的副作用一般有哪些呢?

  1. 输出内容到屏幕
  2. 写数据到文件或数据库
  3. 修改了对象的属性

阅读全文 >>