我认为通过与面向对象的方法进行比较可以最好地证明其重要性
例如说我们有一个对象
Order
{
string Status {get;set;}
Purchase()
{
this.Status = "Purchased";
}
}
在OO范式中,方法被附加到数据上,并且该方法对数据进行突变是有意义的。
var order = new Order();
order.Purchase();
Console.WriteLine(order.Status); // "Purchased"
在功能范式中,我们根据功能定义结果。购买订单是购买功能应用于订单的结果。这意味着我们需要确定一些事情
var order = new Order(); //this is a 'new order'
var purchasedOrder = purchase(order); // this is a 'purchased order'
Console.WriteLine(order.Status); // "New" order is still a 'new order'
您是否需要order.Status ==“ Purchased”?
这也意味着我们的功能是幂等的。即。两次运行它们应该每次产生相同的结果。
var order = new Order(); //new order
var purchasedOrder = purchase(order); //purchased order
var purchasedOrder2 = purchase(order); //another purchased order
var purchasedOrder = purchase(purchasedOrder); //error! cant purchase an order twice
如果通过购买功能更改了订单,则purchaseOrder2将失败。
通过将事物定义为函数的结果,它使我们可以使用那些结果而无需实际计算它们。在编程方面,这是延迟执行。
这本身可能很方便,但是一旦我们不确定某个函数何时真正发生并且对此表示满意,我们可以比在OO范例中更多地利用并行处理。
我们知道运行一个函数不会影响另一个函数的结果。因此我们可以让计算机以它选择的任何顺序执行它们,并使用任意数量的线程。
如果一个函数改变了它的输入,我们必须更加注意这些事情。