写点什么

「编程概念」融合理解函数式和面向对象

用户头像
顿晓
关注
发布于: 2021 年 04 月 08 日
「编程概念」融合理解函数式和面向对象

遇到的问题

函数式和面向对象 2 个编程范式的讨论一直不断:

而且同时精通 2 者的程序员比重也较少,造成了程序员群体的天然割裂;

另外,越是一种范式用得熟,去了解另一种的动力越小;

最坑的地方在于,越是想只用一种范式搞定问题,会陷得越深,把解决方法搞复杂,直到失控。

但,好消息是:这种情况在快速改善。

分析

不管是函数式,还是面向对象,其下层的组成元素是一样的:数据和函数。

其要解决的问题也是一样的,反过来就是同一个问题用 2 种范式都可以实现。

其差别在于对数据和函数的组织方式不同,准确地说是组织方式的表现不同,深入挖掘一下会发现其组织方式的底层思想是相同的,如模块级别的组织:

  • 函数式

使用模块来组织自由的数据/类型和函数,在语法层面限制较少,主要靠开发风格约定以及开发人员的设计;

  • 面向对象

面向对象中也有模块的概念,但类/对象自身也带有模块组织的作用,如果一个类/对象很大,也足够和函数式中的一个模块等同了,如 Array 这个模块/类/对象;

所以类/对象可以理解为加了限制的模块,让数据/类型和函数绑得更紧密了。

当然,模块可以有层级概念,在 2 种范式中都允许,只是在函数式中,层级是同构的,能让人有美感,吸引了一波颜粉;面向对象中则有意无意之间弱化了模块作用,导致类/对象不自觉地膨胀,招了一波黑粉。


除了组织方式,2 者在学习路径上也有些许差异:

  • 面向对象

虽然也有初级和高级之分,但初级学完就能完成大部分工作了,所以容易吸引新粉;

  • 函数式

如果第一门学习的编程语言不是函数式,而是从面向对象转过来的,很容易学完初级后就停下来了,因为函数式在初级和高级之间有一道明显的门槛:高阶函数,而这和高等数学一样,不是生活经验中存在的概念,必须从无到有地掌握。

而,最坑的地方在于,函数式只学了初级,只能完成很少一部分工作,所以新粉流失很厉害。


这里给一个理解方式,把高阶函数当成是类/对象,也是绑定数据/类型和函数的一种方式,如用高阶函数模拟一个类/对象:

const Person = () => {  let name  let age    const get = () => {    return { name, age }  }  const set = (name_, age_) => {    name = name_    age = age_  }    return [get, set]}
复制代码


以上,用函数式中的闭包实现了对数据的绑定,返回的函数就相当于是类/对象中的方法。虽然不够纯正,但也是货真价实的高阶函数了。

用这个桥梁再去理解其他高阶函数,就有了概念的起点。

发布于: 2021 年 04 月 08 日阅读数: 72
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 知识星球「俺的死党顶」

评论

发布
暂无评论
「编程概念」融合理解函数式和面向对象