纯函数

什么是纯函数?

纯函数是仅依赖于其参数的函数,并且其唯一可观察到的输出是返回值。 给定输入,纯函数将始终求值为相同的输出。 换句话说,它们是独立的且无状态的。

纯函数是没有副作用的函数。 副作用是,在函数范围内声明的某些值在函数内部发生了变异。 函数doubleNumbers()是函数的示例,因为它修改了在函数范围之外声明的数字。 由于doubleNumbers()不是纯函数,因为它依赖于外部状态。

 类DataStore { 
变数= [Int]()
  func doubleNumbers(){ 
var doubledNumbers = [Int]()
 用于self.numbers { 
让doubledNumber =数字* 2
  doubledNumbers.append(doubledNumber) 
}
  self.numbers = doubledNumbers 
}
}
 让存储= DataStore() 
store.numbers = [1,2,3,4,5]
store.doubleNumbers()// [2,4,6,8,10]

下面是另一个示例。 有两个温度类别,每个温度类别都具有一个华氏度属性,该温度类别代表华氏温度。 每个类中还声明了一个将华氏温度转换为摄氏温度的函数。

 温度A类{ 
var°F:Double = 60
  func convertToCelsius()-> Double { 
让度C =(self.F-32)*(5/9)
 返回度 
}
}
  class TemperatureB { 
var°F:Double = 60
 静态函数convertToCelsius(_度:Double)-> Double { 
让度C =(度F-32)*(5/9)
 返回度 
}
}
 设temp1 = TemperatureA() 
let DegreeC1 = temp1.convertToCelsius()// 15.6
 设temp2 = TemperatureB() 
let degreeC2 =温度B.convertToCelsius(temp2.​​degreesF)// 15.6

TemperatureA的convertToCelsiusFunction与°F变量紧密耦合。

有什么意义?

我以这种方式编写函数的原因主要有两个(尽管并非总是可能的)。 由于第二个原因,当您以这种方式编写函数时,程序变得更容易推理:程序的体系结构变得更加模块化。 纯函数不依赖任何外部状态。 由于纯函数与它们外部的世界是隔离的,因此很容易将函数交换进出。 您还可以更加灵活地声明函数的位置,因为通常(如果不是总是)它们将使用static关键字进行声明。

由于其模块化和推理的简便性,可维护性得到了改善。

纯函数很容易在代码中移动,重构和重组。 这将使您的程序更加灵活,并适应未来的变化。