蘑菇云课堂内容
Scala的核心力量是什么?
基于自上而下和自下而上的软件设计和编程实践的基础之上结合数据状态不可变性并且融合了类型系统和隐式转换技巧的函数式编程
说明1 自下而上和自上而下的编程方法完美结合
自上而下(对象):面向对象编程,把软件系统作为一个个对象,具体的功能由对象本身以及对象之间的消息传递来完成
自下而上(动作):函数式编程,强调功能的具体实现
两者结合,非常强有力的表达现实世界,比如人 吃饭 ----人是对象,吃饭是动作,
人与人之间的交互是通过消息(信息)来传递的,
而吃饭这动作是每个人自己的动作,别人是不管你是怎么吃的。
说明2:数据状态不可变性质
假如判断两个对象是否相等,必须判断上下文,什么条件,什么状态相等。如果是多线程并发编程。
对象的数据状态修改,不是一件简单的事情。如果是一套复杂的继承结构,对象有很深度的引用。判断对象是否相等,非常困难。
并发编程hashmap序列化后,下一次反序列化,即使在同一台机器。如果状态可以变化,下一次不能确保完全一致。
并发时可变状态数据要加锁,不可变数据不需要锁,后者提升几十倍性能。
使用不可变对象可以大幅减少运行时故障。当面对可变与不可变的选择时,选择不可变对象无疑是最安全的。
简化编程,提升效率,减少bug,方便分布式并发
说明3:类型系统+隐式转换 玩转这个是scala高手的最直观表现
说明4:函数式编程 (这个以后再细说,现在还不是很清楚,面对结果编程的样子 -_-! )
补充:Scala基于JVM可以直接调用Java的所有库和框架的功能,站在巨人的肩膀上
Scala的黄金定理
定律1:状态不可变
简化编程,提升效率,减少bug,方便分布式并发
定律2:优先考虑面向值的编程方式,一般都和不可变形结合
觉得就是在写方法时,要让方法简洁直观,不要添加可变的变量的样子,一定要加变量也是加不可变变量。如下面的例子:
def process(code: Int): String = {
var result: String = "0"
code match{
case 0 => result = "1"
case 1 => result = "3"
case _ => result = "5"
}
return result
}
例子中的 var result不应该存在,要存在变量也得用val result,最简洁的是这样
def process(code: Int): String = code match{
case 0 => "1"
case 1 => "3"
case _ => "5"
}
定律3:多步骤对象操作是采用this.type构造的链式表达式
这个容易理解,采用this.type方式,返回的是对象本身,就可以直接调用对象的其他方法,
最后体现就是一个链条一样的语句
定理4:使用Option(None和Some),用None取代Null.Option可以像普通集合操作Map,极大简化代码
这可以避免报错,空指针异常,有了这个当是空时可以指定默认值。
使用getOrElse()来访问值或使用默认值.
定理5:使用伴生对象构造接口或者抽象类或者类的实例。
往深处看,这是编程架构上考虑的技巧,实例对象是在apply方法里生成的,在抽象类或者接口里直接用括号创建对象,
但是真正生成的对象并不能直接看出来,要通过apply去看它究竟是生成了哪个实例对象,其实普通使用者不需要知道是哪个对象,
只要知道能使用这个抽象类或者接口里的方法就行了,具体的实现普通使用者并不关心,知道有这个方法要用这个方法就行了,
觉得这个有点深奥。
黄金定律以后再继续补充…
以上内容来自[DT大数据梦工厂]首席专家Spark专家王家林老师的课程分享。感谢王老师的分享,更多精彩内容请扫描关注[DT大数据梦工厂]微信公众号DT_Spark