我们有两种编程方式:命令式和声明式
命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。 声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。 举个简单的例子,假设我们想让一个数组里的数值翻倍。
var numbers = [1,2,3,4,5]
var doubled = []
for(var i = 0; i < numbers.length; i++) {
var newNumber = numbers[i] * 2
doubled.push (newNumber)
}
console.log (doubled) //=> [2,4,6,8,10]
/*--声明式---*/
var numbers = [1,2,3,4,5]
var doubled = numbers.map (function (n) {
return n * 2
})
console.log (doubled) //=> [2,4,6,8,10]
java是面向对象
scala是面向对象和函数式的结合
面向对象编程
https://www.zhihu.com/question/19729316#231973
面向对象编程强调的是对象和消息. 比如:门被风关上了,门是个对象,风是个对象,关是个动作我们定义为方法.则门对象应该有一个关方法:guan(Feng weifeng)
函数式编程
函数式编程关心数据的映射。
把逻辑完全视为函数的计算。把数据与逻辑封装到函数中,通过对函数的计算,加工,处理,来生成新的函数,最后拼装成一个个功能独立的函数。在运用这些函数,完成复杂逻辑的实现。
面向对象函数和函数式编程差异
函数式编程特点
- 函数是一等公民
- 纯函数
函数式编程中我们把数据和逻辑封装到函数中而不是类与对象中。每个函数完全独立,好的函数式设计,每个函数都是一个纯函数(pure function,即输入固定参数,即可得到相同输入的函数)。
面向对象中的任何一个原型方法(prototype)都会获得this的数据,而且可以轻易获取闭包的数据。这样的非纯函数让我们非常难以提炼与抽象。
纯函数由于输入与输出固定,所以变得非常容易单测。好的函数式中的函数设计,不会依赖于任何其他函数或者声明配置,只需要传递参数,既可以进行测试。而在面向对象语言中,我们往往需要启动整个工程,或者说所有依赖的类全部要加载,才能开始测试。
- 模式匹配
map reduce filter等 - immutability
什么是immutability? 实细分起来有语法上的 immutable (例如 Java 里的 final 关键字), 和运行时对象的 immutable (一个变量名可以修改指向不同对象, 但对象的内容不可变). 两者的联系是: 如果语法上规定所有变量都是 "final" 的, 那么运行时对象就相当于都 immutable 了. 但如果语法上部分变量是 final, 部分不是, 那么就不能得出运行时对象全都 immutable 的结论.
immutability优点?
1)、运行速度。并发下,很多地方说immutability会拖慢程序,其实并没有。应用了 immutability 的 VM 实现可以去掉很多情况的 lock, 并发处理速度会更快. 不是并发处理的情况, 如果所有对象都 immutable, 手动的保护性拷贝都可以去掉,处理复杂业务会更简单快速.
2)、gc。因为只有新对象指向老对象, 老对象不能指向新对象, 对实现分代 GC 的人来说真是一个天堂。没有环引用! 不用做环检测不用加弱引用, 那引用计数还不爽翻了?