高手问答第 253 期 —— 函数式编程的优缺点

雑人 发布于 08/24 19:04
阅读 7K+
收藏 7

函数式编程出现已经有很长的历史了,最近几年由于多核CPU与分布式系统的广泛应用、人工智能的兴起,以及人们对高并发、高性能、高可用软件的强烈需求,它再次进入业界视野,受到大家的重视。

函数式编程的特点是适应分布式系统的开发、程序可证明、代码简洁、运行时错误少、可维护性强。对于个人开发者来说,了解函数式编程,能拓宽视野,提高逻辑思辨能力,让自己的代码更加的优雅和健壮。

OSCHINA 本期高手问答( 2020 年 8 月 25 日——2020 年 8 月 30 日 ) 我们请来了杜万老师@vangie 和大家一起探讨关于函数式编程的优缺点,以及如何学习函数式编程。

问答主题

本次问答主要包括以下方向:

  1. 函数式编程的优势是什么?
  2. 学习函数式编程的难点在哪里?
  3. 函数式编程未来的发展前景如何?

有其他相关的问题,也欢迎提问。
 

嘉宾简介

杜万,15年Java Web开发经验,曾主导研发过Coding WebIDE,擅长互联网应用架构,热衷于整合框架和开发工具,先后翻译并出版了《Elixir程序设计》《函数式编程入门:使用Elixir》。2018年加入阿里云,先后负责函数计算的工具链和云效云端工作台的研发工作。

为了鼓励踊跃提问,华科大出版社会在问答结束后从提问者中抽取5名幸运会员赠送《函数式编程入门:使用Elixir》一书。

天猫:https://detail.tmall.com/item.htm?id=620896830222

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就相关问题向杜万老师 @vangie  提问,请直接回帖提问。

加载中
1
雑人
雑人

高手问答第 253 期 —— 函数式编程的优缺点

@append @LongCity @朱静程 @wy65 @becke 恭喜以上五位网友分别获得图书一本

请在48小时内私信 @雑人 告知快递信息(格式:姓名+电话+地址),过期中奖资格将会被取消!!

7
apolis
apolis

@vangie杜万老师,你好。
关于“函数式”和“面向对象”思考问题的角度,我听过一个说法“函数式抽象出一个个动词,面向对象抽象出一个个名词”。

杜万老师对此说法怎么看?关于“函数式”和“面向对象”思考角度的区别,杜万老师有什么别的见解?
在实际项目中,杜万老师的经验里,解决什么类型的问题“函数式”比“面向对象”要实用?解决什么类型的问题“面向对象”比“函数式”要实用?

2
开源中国首席罗纳尔多
开源中国首席罗纳尔多

@vangie 您好,请问函数式就是不建立对象吗类似c?不是面向对象更加直观吗?

lidashuang
lidashuang
c是命令式,当然c 也可以面向对象
2
ggzone
ggzone

函数式优点真的很多,但个人感觉多范式更好一些,比如像scala这种集成了面向对象编程和函数式编程各种特点

ggzone
ggzone
回复 @ifsc01 : 以前稍微接触过Erlang,很另类也很强大,感谢推荐elixir。
lidashuang
lidashuang
回复 @ggzone : elixir很香
ggzone
ggzone
回复 @SherlockGy : 这里只是拿scala举个例子,没有撑scala的意思。好的特性应该相互借鉴(当然不是要另一个c++),不要走向极端。当然了,也可能吾之蜜糖,彼之毒药。
S
SherlockGy
Scala社区都有点分裂,有的包函数式,有的包命令式,混乱
ggzone
ggzone
回复 @vangie : 多谢指点,有时间我也多了解一下elixir
下一页
1
李永波
李永波
不觉得函数式编程比面相对象有优点 ,一个个函数强制去排序不如面相对象的更好理解,比如加法 2进制和10进制的结构展示方式不同,面相对象的静态方法也可以实现方法式编程。而且带上了类的表述应该是更清晰
w
wangzx99
FP 和 OOP 本身是 正交的 x轴和y轴。并不是说函数就相当于静态方法,OO就不能FP, FP就不能OO的。 以 Java 为例,一个方法(包含实例方法、静态方法)算不算得上是一个函数,核心取决于这个方法是否是引用透明的(仅依赖参数,可以把 this 也是为一个参数),是否无副作用(除了返回值外,不改变其他内容,包括this对象中的内容),如果满足的话,那也是 FP 的方法。
lidashuang
lidashuang
感觉 你说的“函数” 和 函数式编程 不一个概念
1
赤脚小子
赤脚小子

@vangie 你好,个人觉得阻碍函数式编程普及的一个难点就是难以测试

无论是个人DEBUG还是做单元测试

抽象程度这么高的写法,可读性也是问题。

如果想在TEAM内普及函数式编程,请问您有哪些经验?踩过哪些坑呢?

lidashuang
lidashuang
回复 @下里巴人_770728 : 赞同
下里巴人_770728
下里巴人_770728
感觉相反, 容易写单元测试, 感觉正是函数式的优点. 测试对象是单个函数, 测试依赖就是入口参数, 非常容易模拟. 而OO编程时, 写测试经常需要mock.
vangie
vangie
好不好测试很大程度在于有没有好的测试矿建可以用。Spring 5.0 推出 WebFlux 提供的测试框架就不错,Elixir 也内置了 Test 框架。
1
Morty_a
Morty_a

@vangie  杜万老师   编写软件最主要的一方面就是要管理好复杂性,而唯一能够阻碍写出好软件的就是我们管理复杂性的能力。函数式编程语言为我们提供了最有力的工具用于管理复杂性, 但是  函数式编程也有不太擅长的场合,比如处理可变状态和处理IO等,而且 函数式编程强调没有"副作用",意味着函数要保持独立, 这就要求程序员对程序各个部分之间的交互细节了如指掌, 通过避免运算单元之间发生交互来实现并行运算 , 这样对于编程人员的的水平,和入门门槛,相比于命令式编程 提高不少

1
append
append

@vangie 杜万老师好

我个人认为在系统开发中合理使用函数式编程比为了使用函数式编程而编程效果会好不少,面向对象通俗易懂,在代码的维护及扩展性方面有着良好的优势,但函数式编程的简洁,易用性的优点是不可否认的,我们团队在开发过程中对于集合类的排序、分组强制用lambda实现,但自己设计的程序,根据团队内部的整体能力,我们采用保守的面向对象设计。

在设计函数是编程的时候,团队内部各层次人员参差不一的情况下,使用、推广、培训的落地,您有什么建议呢?

vangie
vangie
面向对象的优势在于建模,和真实业务模型的映射比较直观。函数式更侧重于以数据的流动。日常开发中大我会在的方面采用分层设计,使用面向对象,内部实现写成函数式。所以对于参差不齐的开放者来说,差异点更多的在于方法内部的实现,可以作为一种提高的写法,不强求也可以兼容。
1
梅开源
梅开源

@vangie

请问各种编程语言中,哪些函数式编程用起来快感强,格外爽?

vangie
vangie
带类型推演的。
1
htoooth
htoooth

@vangie 函数式与对象式在思维层面上,最主要的改变是什么?

vangie
vangie
面向对象对于建模比较自然,很容易和真实世界产生映射。函数式更强调的数据流,关注的是输入和输出之间的变化。
返回顶部
顶部