Scala進階之核心力量和黃金定律

蘑菇雲課堂內容

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章