前言
在課程 1 ~ 3 集學習了 Clean Architecture domain layer 的測試與實作,在這篇筆記中會著重在 data layer 的部分。
筆記
Flutter TDD Clean Architecture Course [4] – Data Layer Overview & Models
這集從頭到尾都在講 raw data 的測試跟 parse JSON。
num 是 int 跟 double 的父類別,在 parse raw data 時可以當作語法糖來用,少寫一些判斷,不太確定為何要有這種介於兩者的存在,可能在轉換或賦值時容易語法錯誤吧?
dynamic 等同於 Kotlin 的 Any 或 Java 的 Object,可以是任何東西。
factory 很像是 Kotlin 寫在 companion object 裡面的 function,又或是 Java 的 static,我不想 new instance,所以就用 factory 來寫 function。
Flutter TDD Clean Architecture Course [5] – Contracts of Data Sources
在定義 data source contract 時,作者將錯誤用後綴 Exception 命名,但是 repository 的 contract 則是將錯誤用後綴 Failure 命名,我覺得這個方法分隔了不同 layer 所造成的問題,一眼就看得出來是錯在什麼地方,把 Exception 留給 data layer(實作),把 Failure 留給 domain layer(業務邏輯),寫得很優雅。
Flutter TDD Clean Architecture Course [6] – Repository Implementation
這集開頭在處理上集寫到一半的測試,因為是 TDD,所以實作會在測試通過時一起被補上。因為 getConcreteNumberTrivia 跟 getRandomNumberTrivia 極為相似,因此實作完其中一項,另一項的測試跟實作時是直接複製貼上再改有差異的地方。
最後則是安排了 repository_impl 的重構,因為測試都寫完了,所以可以肆無忌憚地大改(?)。一開始發現了 getConcreteNumberTrivia 跟 getRandomNumberTrivia 有大量重複的邏輯,因此建立一個 private function 將共用的邏輯抽出去,只要丟關鍵 function 進去即可。後來覺得丟 function 進去太醜,又抽出了 typedef 來加強可讀性。
底線 _ 開頭為 private 之意。
教學中的 typedef 已經是舊的語法了,新的語法:https://dart.dev/guides/language/effective-dart/design#dont-use-the-legacy-typedef-syntax
為啥不用一個 class 當作參數帶進去共用:https://dart.dev/guides/language/effective-dart/design#avoid-defining-a-one-member-abstract-class-when-a-simple-function-will-do
專案連結
想看我實作的完整專案程式內容請瀏覽我的 github:
留言列表