2016年6月17日 星期五

研究 Scala 的一小部分想法

這幾天開始研究 Scala ,相較於 Javascript ,嚴謹多了,而它主要是基於 JVM 的下一代 Java 語言。其中有不少語法特性,值得思考。

比方像是 override 關鍵字,若子類別使用到父類別同名的成員變數或功能,則必需指定 override ,表示子類別「確實」要使用同名的變數或功能,而且要自己實作這個功能。這樣的語法,使得軟體工程師在寫程式,一定會注意到是否寫到 override 的部分。

以前作大型專案時,曾經有個網頁程式一直出錯,但很難查出問題在那。後來就從頭一步一步查起,結果是在前端的 javascript 中,有一個功能的名字,跟使用到的 javascript lib 「一模一樣」,但因為 javascript 沒有「強制」override 的識別功能,所以,程式跑起來就不穩定,只要使用到這個同名功能時,就會出錯。

另一個看到的是 Structural typing。這個跟 Groovy 的 duck 的概念類似,也就是,如果走起來像個鴨子,叫聲像個鴨子。那它就應該是個鴨子。Scala 的 Structural typing,可以自行定義一個結構,來表示這些行為,從而使用這些動作,即使是沒有關係的類別,只要符合結構定義的行為,就可以使用這個行為。

def doQuack(o: {def quack(value: String): String}) {
  println (o.quack("Quack"))
}
class NorthDuck {
  def quack = "quack"
}
class SouthDuck {
  def quack = "quack quack"
}
doQuack(NorthDuck)
doQuack(SouthDuck)

這樣的特性,有什麼用處?有時候,我們需要增加既有的程式一些功能,但原程式並沒有提出 interface 之類的元件,可以讓我們用繼承的方式使用時,就可以藉由結構,把需要的「行為」定義出來,這樣就可以增加新的類別元件,採用跟原程式庫中相同的「行為」名稱,而不需動到既有的程式庫。

沒有留言:

張貼留言