Scala的編程規範與最佳實踐

應用層

80/20原則:80%的代碼是 純函數,其餘如處理IO,數據庫,用戶交互等方面的20%的代碼也應該儘量輕量級
培養面向表達式的編程思維,培養函數式編程思維
用Actor模型實現併發功能
將更多的 行爲 從 類裏 移到 更細粒度的 trait中

代碼層

堅持寫純函數
習慣將函數作爲變量和參數進行傳遞
重點學習scala的集合類和其API
儘量使用immutable代碼,優先使用val和immutable集合
使用Option/Some/None/ 忘記 java null的概念
使用 try/Success/Failure類
使用一種TDD/BDD 測試工具如 ScalaTest 或 specs2
使用SBT來構建項目
編碼時 打開一個Scala的REPL控制檯,隨時測試驗證的你的想法

純函數-沒有副作用的代碼段

引用透明性:同樣的輸入參數,總是返回同樣的結果!
表達式的值沒有依賴應用的某個 狀態|值|IO,只依賴輸入參數和計算算法
無副作用:函數不應該帶來對應用的某個 狀態|值 的mutable
不會對輸入參數進行 改變 mutable
不執行IO操作或者和用戶進行交互

純函數實例

數學計算方法,如 + - *
String的 split、length、to* 方法
immutable集合上的方法, 如map、drop、take、filter flatMap
從HTML字符串中 抽取值的方法,模式匹配

非純函數-帶副作用的

getDayOfWeek getHoure getMinute
getRandomNumber
讀取用戶輸入的、或打印輸出的 方法
向存儲器 讀寫 數據的 方法
Java程序中一般很多:字段通常是 mutable的;
類似set方法mutable了類內部的字段,而get方法則可能返回 可mutable的數據結構
分析java源碼 然後慢慢重構爲Scala化的 代碼 善用 case class和 object單例對象

儘量使用immutable對象

儘量優先使用immutable集合和val 變量
private val varname = new MutableObject
如讓外部有直接操作或改變內部對象的權利

面向表達式的編程Expression Oriented Programming

面向表達式的編程指每一語句都是一個表達式,有返回值,無副作用, 函數式編程語言都應該這樣!
相對的statement編程是不返回數據,使用副作用!
scala中的if/else match/case try/catch 都有返回值
優點:更易理解的代碼;沒副作用,更容易測試
與scala語法綁定;更適合多核計算機

使用match/case來模式匹配

使用場景:
try catch
函數或方法的主體中
Option Some None 代碼模式中
actor的receive中
替代笨拙的 if else if else switch/case
模式匹配中 case class
部分函數中

忘記java中null的概念禁止使用null

變量初始化用Option 參數使用Option
沒有獲取預期的結果時 返回Option|None而非null,
用try success failure 範式來返回錯誤信息
函數或方法不要返回 null,返回Option或者 try替代
將第三方包返回的null轉換爲Option
從Option獲取值
同時使用Option 和集合 map flatten flatMap collect
Try/Success/Failure提供更好的處理方式:filter flatMap flatten foreach map get getOrElse orElse toOption recover recoverWith transform

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