2016.12.3, 北京, Ken Fang
函數響應式編程爲使函數內的代碼更加的強壯, 便需在代碼編譯的階段時, 就要能確定傳入函數的參數類型, 是符合領域模型中的商業規則。也就是說, 藉由編譯器形成一過濾器; 只讓符合領域模型中商業規則的參數類型, 能傳入到函數中。
舉個簡單的例子:
假設, 只有 saving account 能有利息的收入, 而checking account 便沒有利息的收入。
Scala 藉由靜態類型 (Static Types) 的實現的方式, 使得編譯器形成一過濾器; 只讓 saving account 的參數類型, 能傳入到函數中, 進行利息的計算, checking account 的參數類型, 便會被過濾掉。
trait Account {
def number: String
def name : String
//...
}
case class CheckingAccount(...) extends Account
trait InterestBearingAccount extends Account {
def rateOfInterest: BigDecimal
}
case class SavingsAccount(...) extends InterestBearingAccount
case class MoneyMarketAccount(...)extends InterestBearingAccount
def calculateInterest[A <: InterestBearingAccount](account: A, period: DataRange) = {
}
參數類型 A 必需是 InterestBearingAccount 的 subtype; 所以, 只要不是 InterestBearingAccount 的 subtype 的 account, 便不能傳入到函數 calculateInterest 中, 去計算利息。
也就是說, 函數 calculateInterest 便只需專注在如何實現利息的計算。而將商業規則的校驗; 只有 saving account 纔能有利息的收入; 交由編譯器去處理。所以, 我們便也不需給函數 calculateInterest 寫測試代碼; 爲了校驗所傳入的 account 是否爲 saving account ?