使用纯函数处理随机值

使用随机值可能会导致难以测试的代码。通常,解决这类问题的方法是使用纯函数。纯函数是指在给定相同输入时,总是返回相同值的函数。由于它们没有副作用且返回值是可预测的,因此测试纯函数要容易得多。

// 一个返回随机值的非纯函数
const getNumber = (min = 0, max = 1) =>
  Math.max(Math.min(Math.random(), max), min);

从定义上看,纯函数和随机值似乎不太兼容。毕竟,随机性本质上意味着不可预测性。天真的方法是将随机性移出函数,并将生成的值作为参数传递给它。这只会隐藏问题,而不是解决问题,更不用说需要大量重构才能工作。

然而,使用函数的参数的方法是正确的。关键在于函数参数可以省略,这使我们可以为其指定默认值。这样,我们就可以将随机值作为参数传递给函数,如果参数被省略,函数将使用默认值。

但是,我们如何将随机值作为函数的默认参数传递呢?幸运的是,JavaScript 将函数参数的求值推迟到函数调用时。这意味着我们可以使用 Math.random() 生成随机值,并将其作为函数的默认参数传递。

// 一个返回随机值的纯函数
const getNumber = (min = 0, max = 1, num = Math.random()) =>
  Math.max(Math.min(num, max), min);

通过进行这个简单的更改,您可以避免许多麻烦。使用诸如 Math.random() 这样的函数作为默认参数将需要最少的重构,并使您的代码更易于测试。