「编程概念」融合理解函数式和面向对象
遇到的问题
函数式和面向对象 2 个编程范式的讨论一直不断:
而且同时精通 2 者的程序员比重也较少,造成了程序员群体的天然割裂;
另外,越是一种范式用得熟,去了解另一种的动力越小;
最坑的地方在于,越是想只用一种范式搞定问题,会陷得越深,把解决方法搞复杂,直到失控。
但,好消息是:这种情况在快速改善。
分析
不管是函数式,还是面向对象,其下层的组成元素是一样的:数据和函数。
其要解决的问题也是一样的,反过来就是同一个问题用 2 种范式都可以实现。
其差别在于对数据和函数的组织方式不同,准确地说是组织方式的表现不同,深入挖掘一下会发现其组织方式的底层思想是相同的,如模块级别的组织:
函数式
使用模块来组织自由的数据/类型和函数,在语法层面限制较少,主要靠开发风格约定以及开发人员的设计;
面向对象
面向对象中也有模块的概念,但类/对象自身也带有模块组织的作用,如果一个类/对象很大,也足够和函数式中的一个模块等同了,如 Array
这个模块/类/对象;
所以类/对象可以理解为加了限制的模块,让数据/类型和函数绑得更紧密了。
当然,模块可以有层级概念,在 2 种范式中都允许,只是在函数式中,层级是同构的,能让人有美感,吸引了一波颜粉;面向对象中则有意无意之间弱化了模块作用,导致类/对象不自觉地膨胀,招了一波黑粉。
除了组织方式,2 者在学习路径上也有些许差异:
面向对象
虽然也有初级和高级之分,但初级学完就能完成大部分工作了,所以容易吸引新粉;
函数式
如果第一门学习的编程语言不是函数式,而是从面向对象转过来的,很容易学完初级后就停下来了,因为函数式在初级和高级之间有一道明显的门槛:高阶函数,而这和高等数学一样,不是生活经验中存在的概念,必须从无到有地掌握。
而,最坑的地方在于,函数式只学了初级,只能完成很少一部分工作,所以新粉流失很厉害。
这里给一个理解方式,把高阶函数当成是类/对象,也是绑定数据/类型和函数的一种方式,如用高阶函数模拟一个类/对象:
以上,用函数式中的闭包实现了对数据的绑定,返回的函数就相当于是类/对象中的方法。虽然不够纯正,但也是货真价实的高阶函数了。
用这个桥梁再去理解其他高阶函数,就有了概念的起点。
版权声明: 本文为 InfoQ 作者【顿晓】的原创文章。
原文链接:【http://xie.infoq.cn/article/84509d90a2caaa0a2a80329db】。文章转载请联系作者。
评论