转载

面向对象与函数式的思考

语序的区别

在很长一段时间里,OOP在程序语言里占了统治地位。之所以它会如此流行,不是因为它有多优秀,而是因为它更容易被接受。在OOP里,对象是第一位的,动作是第二位的,这和主流的人类语言最为接近。例如,在面向对象的语言里,要描述”我看书”这个概念,一般是这样的:

i.read(book) (python, c++, java, ...)
    i read book  (ruby, scala, ...)

这和人类语言的思维非常相似。而在函数式语言里,要表达这个概念就变成了:

read(i, book) 或者
    (read i book)

在英语和中文里,语序都是”我 看 书”, 在日语和韩语里,语序是”我 书 看”, 无论如何,作为主语的”我”总是放在最前面的。而如果让你改口说”看 我 书”,无疑会非常别扭。

先有对象还是先有动作

在面向对象语言里是先有对象后有方法,方法隶属于对象。这和人类直觉的思维方式是一致的。在OOP中,万物皆对象,数字是一种对象,数组是一种对象,字符串是一种对象, lambda是一种带有apply方法的对象。这很容易接受,对不对?

然而到了函数式语言里,万物皆lambda。对象是一个lambda, 对象的的方法是你给这个lambda传递的参数(消息)。任何东西都是lambda实现的!数字是一个lambda,数组是一个lambda(参数是index, 返回值是元素), 甚至if/else都是lambda, 你还能接受吗?

不过,虽然这两者的理论都算比较完美,真正实现了面向对象或者函数式的语言并不多。除了面向对象里的Smalltalk, 函数式里的Haskell, 剩下的几乎都是些不能自圆其说的语言(例如C*/Java/Scala/Javascript/Python/Ruby/…以下省略一万字)。举个例子,Smalltalk里,if/else是对象的一个普通的方法,而在Haskell里,if/else是普通的函数。而在大部分声称自己是面向对象或者是函数式的语言里,if/else都是凭空存在的。

原文  http://blog.codescv.com/programming/2016/12/24/oop-vs-fp.html
正文到此结束
Loading...