纯函数
什么是纯函数?
纯函数是仅依赖于其参数的函数,并且其唯一可观察到的输出是返回值。 给定输入,纯函数将始终求值为相同的输出。 换句话说,它们是独立的且无状态的。
纯函数是没有副作用的函数。 副作用是,在函数范围内声明的某些值在函数内部发生了变异。 函数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关键字进行声明。
由于其模块化和推理的简便性,可维护性得到了改善。
纯函数很容易在代码中移动,重构和重组。 这将使您的程序更加灵活,并适应未来的变化。