谈谈函数式编程的优点(1)
(注:这是作者本人的体会和随想,想到那里写到哪里,不定时更新,有错误请指出。)
函数式编程(FP)和面向对象(OO)是两种不同的编程范式,近几年,随着对FP的重新认识,不少人认为相比OO,FP有一些明显的有点,不少地方甚至于更近一筹。
为何他们认为函数式编程(FP)优于面向对象(OO)?
思想不同,重用粒度不同,FP中的粒度更小。
在OO中,认为万物皆对象。
举例来说,在OO中,已经有一个衣柜类,可以现在需要一鞋柜,怎么办?衣柜和鞋柜粗看起来差不多,可具体构成的细节却有不少差别,衣柜用来放衣服,比较高,要有吊杆能挂衣架,里边可能有格挡可能没有。鞋柜用来放鞋,比较矮,里边格挡比较密集,等等。
OO提供了现成的衣柜,和绑定作用作用于衣柜上的操作。使用OO解决此问题,有两种方法:一种是在类层次中添加抽象“柜子类”,然后将“鞋柜”从抽象“柜子类”继承,这种方法需要修改衣柜类,抽象衣柜类的操作,然后修改“衣柜”类。另一种是改装衣柜类,反正衣柜鞋柜看起来差不多,改改也凑合着能用。
使用OO解决此问题的核心思想是“改装”。
OO思想的核心是数据和操作绑定,操作的重用性天生就要弱。在上例中,要不改装衣柜类,要不就抛开重用,重新实现一个鞋柜类。
而用FP的观点,虽然提供了现成的衣柜类型,可更重要的是提供了构成衣柜的半成品与原材料,例如三合板,结合胶等等。你不用想着怎么将“衣柜”改造为“鞋柜”,你可以选择参照或不参照鞋柜,使用半成品很方便的组装一个鞋柜。这样,无论是衣柜,鞋柜,甚至于书柜,你可以很方便的组合出来。
使用FP解决此问题的核心思想是“组装”。
如果说OO是代码块复用,那么FP就是代码片段复用。OO脱胎于命令式的程序设计语言,从重用的角度上天生就要弱于FP。
函数式编程好在哪里?
通过这些年的工程实践,业界普遍认识到了继承的数据耦合形态高,认为“组合优于继承”,可“继承”毕竟是OO的核心思想之一。这些年以来,各种业界主流编程语言纷纷加入对于FP的支持,例如在C++11中,添加了对Lamda表达式与匿名函数的支持。工程师已经熟悉了命令式的编程,学习FP曲线比较陡峭,这是FP流行不广的最重要的原因之一。
相关推荐
这使得函数对象成为实现策略模式或函数式编程风格的理想选择: ```cpp class AddFunctor { public: template T operator()(T a, T b) const { return a + b; } }; AddFunctor addObj; addObj(3, 4); // 相当于...
不同的范式在处理问题时有各自的优点,如面向对象适合表示复杂实体关系,而函数式编程则强调无副作用和可并行性,有助于提高并发性能。 关于软件生产力,一个高效的框架可以显著提升开发速度。然而,框架的选择应...
Lambda 表达式简化了函数式编程,使得处理集合、事件监听、回调等场景更为简洁。 问题 19:什么是 Hystrix 断路器?它在微服务架构中的作用是什么?答案:Hystrix 是 Netflix 开源的一个断路器库,用于隔离服务调用...
回答:Vue.js 的高级特性包括组件式编程、双向数据绑定、生命周期钩子函数、计算属性、观察者模式、虚拟 DOM 等。这些特性使得 Vue.js 成为一个功能强大且灵活的前端框架。 二、SPA 单页面应用 2. 说说你对 SPA 单...
通过使用Haskell作为实现语言,它充分利用了函数式编程的优点,提供了高效、可靠的解决方案。不论您是个人开发者还是团队成员,掌握"todo-checker"的使用方法都能极大地提升您的工作效率和代码质量。
- onreadystatechange事件处理程序会在请求的状态发生变化时触发,通常会调用一个JavaScript函数进行响应处理。 - readyState属性表示请求的状态,如正在发送请求、已接收到响应等。 - responseText是服务器返回的...
Kotlin 的语法简洁明了,支持函数式编程和面向对象编程,使得编写 LeetCode 的算法问题变得高效而直观。 在解决 LeetCode 上的算法问题时,Kotlin 的优点体现在以下几个方面: 1. **空安全**:Kotlin 的类型系统...
**组合继承**结合了原型链和构造函数继承的优点,避免了属性的重复创建,但仍然存在调用两次构造函数的问题。 ```javascript function Parent(name) { this.name = name; } Parent.prototype.sayName = function()...
接下来,我们谈谈QML,它是QT提供的一种声明式语言,用于构建灵活且富有表现力的用户界面。QML允许开发者以JSON-like语法定义UI元素,结合JavaScript进行逻辑处理。相比于传统的C++ UI编程,QML更易于理解和编写,且...
开发者可以利用其强大的类型系统和函数式编程特性,编写出更加优雅、可扩展的代码。 接下来,我们来谈谈Firebase,这是一个由Google提供的全方位后端开发平台,它包括数据库、身份验证、存储、消息推送等功能。在...
它结合了最佳优先搜索(BFS)和Dijkstra算法的优点,通过引入评估函数来引导搜索方向。评估函数通常包括两部分:实际路径成本(g(n))和预计剩余成本(h(n))。实际路径成本是从起点到当前节点的实际代价,而预计...
委托在.NET中是一种类型安全的函数指针,它允许我们将方法作为参数传递给其他方法或存储在变量中。换句话说,委托是引用方法的对象。这使得我们可以把业务逻辑封装起来,并在需要的时候调用。委托是C#中的多播委托...
Spring提供了强大的事务管理功能,可以使用声明式事务简化事务的处理,同时支持编程式事务管理,提供更灵活的控制。 **12. 编程式事务和声明式事务如何选择?** - **声明式事务**:适用于简单且固定不变的事务需求...
#### 1. C++或Java中的异常处理机制的简单原理和应用 - **异常的基本概念**:在Java中,异常是指程序运行过程中出现的一些非正常行为,这些行为可能是因为程序本身的逻辑错误、资源访问失败等原因造成的。Java通过...
73.6. 项目中用到的Spring中的切面编程最多的地方:声明式事务管理。 77 73.7. spring的事务如何配置 77 73.8. transaction有那几种实现(事务处理)(Spring) 79 73.9. Spring IoC 79 73.10. Spring AOP面向方面编程 ...
- **编程式事务管理**:通过编程的方式控制事务的开始、提交或回滚。 - **声明式事务管理**:通过配置文件或注解的方式声明事务的边界。 **问题十五:解释一下SpringAOP里面的几个名词** - **Joinpoint**:程序...
这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C++一定...
在构建一个个人博客网站时,Python 是一种非常流行的编程语言选择,这主要得益于其简洁的语法和丰富的库支持。在你的“Blog:我的个人博客网站”项目中,使用Python可能是为了利用其强大的Web开发框架,如Django或...