Scala函数式编程专题--函数思想介绍

2020-06-17 19:19:33于海丽

这样会导致什么问题呢?首先,副作用会让这段代码变成线程不安全。其次,会让这段代码难以测试,如果想测试这段代码的逻辑,就不得不每次都让信用卡扣费。但我们只是想测试一下逻辑而已,并不想真正扣费。再者,当你想要一次购买多杯咖啡的时候怎么办,你只能跳脚。

这时候我们再看看函数式的方式去实现:

函数式的咖啡店

case class Charge(cc: CreditCard,amount: Double)
class Cafe{
 def buyCoffee(cc:CreditCard) : (Coffee,Charge) = {
 val cup = new Coffee()
 (cup,Charge(cc,cup.price))
 }
}

看到了吗,经过我们这样改变之后,函数变得没有副作用了。也就是说,无论执行这个 buyCoffee 函数多少次,它只会返回给我一杯咖啡以及它的价钱,这样我们就可以很方便得对它的逻辑进行测试而不必担心影响到信用卡。并且它可以安全得运行在多线程环境下。

其实从面向对象的角度来看,这是不是有点像面向对象里面的一些设计模式呢?这样做解耦了咖啡和信用卡之间的关系,在后面添加其他功能的时候我们可以方便得进行组合,比如说想要有一个多杯咖啡计费的功能,如果是用上面那段代码来实现需求,那么无疑会很痛苦。但通过函数式的方式改编后,一些变得清晰起来~

从这个角度来说,函数式编程其实也可以是一种编程思维,它无法帮你立即获得更好的职位,但却可以从某种程度上改变你编程的思维,让你写出更优秀的代码。

结语

最近几年,很多新火起来的概念,但它们其实早在上世纪就已经被发明出来,无论时机器学习,深度学习,Python语言,还是函数式编程。这是为什么呢?这是因为这些技术的边界发生变化,或者说这个时代的技术边界变了。

每个时代都有每个时代的技术边界,真正的工程师会知道边界在哪里,只有外行才会无法无边。巴菲特说他不投资自己不懂的东西,正是因为他给自己的划定了一个边界。

苹果公司能够成功的一个重要原因正是因为它清楚得知道时代的边界,并且能在边界内做到最好。你看苹果很多产品都具有划时代的意义是吧,但其实那些产品都不是苹果首创,比如智能手机,最早是日本公司 DOCOMO 发明,个人平板电脑是英国首先发明。IPod,MP3 也是韩国先出品的。苹果公司用的很多技术甚至在 30 年前就有了,但为什么直到被发明出来才为人们所知?

正是因为苹果了解时代的技术边界,并在边界内做到最好。

往小了说,当我们在学习新的技术,或是使用新技术完成某项工作的时候,我们一定要直到它的边界在哪里。往大了说,我们应该像苹果一样,多多思考这个时代的技术边界在哪里,这样才不至于陷入无休止的技术追赶之中。