查看: 3212| 回复: 17
跳转到指定楼层
上一主题 下一主题
收起左侧

functional programming 和 object oriented 概念真的要分开吗?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
我觉得两个重复性很高。

为啥有人总是要纠结是不是functional programming.


上一篇:软件开发文档化问题
下一篇:dynamic programming 啥意思
推荐
lalxyy 2020-11-19 07:05:20 | 只看该作者
全局:
本帖最后由 lalxyy 于 2020-11-18 18:10 编辑

个人感觉FP和OOP都属于指导代码实现方式的设计思想,二者本身并不互斥,也没有 “重复性” 一说。因为implementation的目标是最终交付代码,并不在于严格使用某种编程思想才能达到这一目的,Java等等语言的syntax也是博采众长,利用各种编程思想的优势对自身进行补充,而非死守OOP不放(尤其是Java 8引入的stream API,是一个很好的例子)。

OOP的概念对于抽象代码各个部分的功能分配和代码复用是非常有用的。OOP的三个原则中,继承这一原则为思考代码针对某一功能(比如子类)的公共部分和私有部分切割提供了很好的切入点,即将各个代码块的共有逻辑置于父类中,把各个模块的私有逻辑置于子类中。固然这样做有很多缺点(尤其是私有逻辑和共有逻辑频繁相互call的时候,这种代码很难写得易于维护;Java长期不支持多继承,导致一些代码复用做不到,在Java 8 Interface开始才能提供抽象方法的默认实现)。多态则是为low coupling提供了可行性,即各部分逻辑之间的调用可以力求做到parameter最小化,只需要传入的object提供本部分代码所需要的方法实现即可,这一条对于实现模块间low coupling有一定帮助。

FP背后的思想其实是非常优秀的,单是执行过程中不可变参数(determinism)这一特性足以规避开发过程中很多由于思路不清晰、忘记在哪里动了已定义的变量导致的bug。而且从Lisp等一些语言来讲,FP的函数因为不需要和外部变量交互,实现并行多进程/多线程/coroutine简直轻而易举,不需要考虑任何资源竞争/锁的问题。在一些对于这两点有很强需求的业务场景中,比如data pipeline,这些思想非常实用。而且FP这种 “把函数当成对象” 的思维在21世纪初是非常超前的,在2011-15年之后主流语言和新语言才引入这些特性(Swift的Closure,Java的单一方法Interface,Python的单行lambda,C++11的lambda)并且让链式处理成为了可能。

其实我更看好能够在各个设计思想中博采众长、给予开发者最大自由度的语言。目前Java、Python等语言都在博采众长。软件开发工作的最终目的是交付,而对于具体实施过程而言,完全不必要如此刻板,甚至从互斥的角度去考虑问题。学习优秀的编程思想应该是帮助开发者解决system design问题的钥匙,而不是画地为牢死死抱住某种design不放。

评分

参与人数 3大米 +5 收起 理由
ripxd + 2 给你点个赞!
clairefig + 2 你为什么可以发语音?
CommieCoyote + 1 赞一个

查看全部评分

回复

使用道具 举报

推荐
q3409tujgreia 2020-11-19 14:43:07 | 只看该作者
全局:
functor, applicative, monad这种概念是functional programming里独有的
回复

使用道具 举报

全局:
haskell 这才是真正的 FP。。。其他都只是OOP调用函数而已...
回复

使用道具 举报

全局:
fp和oo是两种截然不同的思维模式吧…反正作为坚定的fp党我感觉相对于fp,oo program有的时候真的又臭又长....
回复

使用道具 举报

🔗
 楼主| techDiscussion 2020-11-18 15:11:15 | 只看该作者
全局:
VioletC2131 发表于 2020-11-18 14:52
fp和oo是两种截然不同的思维模式吧…反正作为坚定的fp党我感觉相对于fp,oo program有的时候真的又臭又长.. ...

可以解释下您对fp的思维模式吗?
回复

使用道具 举报

全局:
重复性很高不至于吧。。。这俩概念完全不一样啊
回复

使用道具 举报

🔗
Sezedai 2020-11-18 16:33:07 | 只看该作者
全局:
拿 fp 的語言親自謝謝程序就知道差別了,反正我剛學的時候感覺極爲不適,完全不一樣的思維。
回复

使用道具 举报

🔗
qiuqiushasha 2020-11-18 23:46:41 | 只看该作者
全局:
其实我也是对fp理解太浅 工作中写的fp代码 感觉也就是个oo改版 通常就是这几个类

迭代: .foreach(), .map().toList/.sum/.max, .reduce(_+_),
lambda函数当参数:def f(x:Int, g: (y:int)=>Int)
函数连一起: f compose g, f andThen g

再高级一点也就是tail recursion了, 无外乎加一个 @tailRec

但写起来 其实感觉多半是个语法糖 跟oop没啥本质区别
回复

使用道具 举报

🔗
jerryzh 2020-11-19 00:01:58 来自APP | 只看该作者
全局:
pure fp会有区别吧 推荐看看 http://learnyouahaskell.com/ 体会一下 当然本身fp也是可以模拟oop的paradigm的 比如 https://wiki.haskell.org/OOP_vs_type_classes
回复

使用道具 举报

全局:
qiuqiushasha 发表于 2020-11-18 07:46:41
其实我也是对fp理解太浅 工作中写的fp代码 感觉也就是个oo改版 通常就是这几个类

迭代: .foreach(), .map().toList/.sum/.max, .reduce(_+_),
你这个说的其实是fp风格吧,毕竟在一门oop的语言里你也不可能写出真正的fp吧😂
我觉得fp的意思是强调结果而不是行为,偏好组合而摒弃继承(没有褒贬的意思233),至于你是用什么syntax去写那就是另一回事情了吧
(说起来chain call写fp风格的程序看起来真的是更优雅233
回复

使用道具 举报

🔗
qiuqiushasha 2020-11-19 03:45:07 | 只看该作者
全局:
harold1385 发表于 2020-11-19 01:04
你这个说的其实是fp风格吧,毕竟在一门oop的语言里你也不可能写出真正的fp吧😂
我觉得fp的意思是强 ...

对啊 所以说 对于像我这种重度java/scala/cpp选手 必然fp挺费劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表