但我認為 Kotlin 缺少類似 swift 的 guard 機制,如果對於多個 nullable 物件,要確認他們均不為 null 再做某件事,程式難免會寫出許多 if null check,會讓 code 繁瑣,詳情可以參考此討論 Kotlin null check for multiple nullable vars。
這點我也不同意,swift 的 guard 實在是有點煩,跟 Java CheckedException 一樣繁鎖,寫起來很囉嗦。
問題是出在有一堆 nullable 的 type 才會有 multiple guard 這種需求,在 Swift 因為常常和 objective c 和 UIKit 對接,所以會有一堆 nullable type ,這是技術債,很難避免。
Kotlin 這裡,我沒有很多需要 multi guard 的地方,印象中最多兩個吧?因為習慣上我會偏好很早之前就把 argument 轉成 nonnull type (比方說從 restful API 過來,通常會有一堆 null,在這一層就通通擋掉了 (reject/validate/convert/default value),能進入 service 層的 nullable 並不多。
或者比方說,你有一個 boolean flag, var enable:Boolean?
。你的需求除了直覺的 enabled/disabled 兩種狀態外,還有另外一個 未設定
的狀態。然後大多數的人取捷徑就直接讓 flag 變 nullable Boolean?
達到三元狀態的需求。
我個人偏好就直接改 enum 了,省得一堆 nullable type。Kotlin 很多定義都是 one liner ,就儘量用吧
最後,如果一個物件上有一堆 nullable type field,這是一種 design smell,臭臭的,應該拆開重構才是 (Database 的 table 有一堆欄位是 null 也代表正規化做的不好)
關於 pair/triple... 我覺得 triple 已經很夠了啊?
而且如果寫到 triple 以上我就會開始看要怎麼改了,另外 Triple 我也不會 return 出去給別人用,都是中間產物而已。有三個欄位要送出去我就會換 data class ,比較好懂。
guava 那邊1 有一些討論為什麼連 Pair 都不好
a long story...
這個架構看完後,真是憂喜半參,憂的部份比較多。
首先,全部的專案感覺都要混在同個 repository ? 希望這只是範例的問題。
第二,能夠共用的有 common, common-client,但感覺沒有很多。common 還好,都是 data model ,設計一份後給所有人共用就行了。
common-client 就有點難了,它將原本寫在 Activity/ViewController 裡的程式抽出共用的部份,盡可能讓所有平台都共用程式碼邏輯。理論上是不錯的。
但經過我這幾年待團隊的經驗,abstraction (抽 interface) 這件事很多開發者都做不好。一是能力不足 (寫前端/mobile 的人大多太年輕),另一個是根本沒機會點這方面的技能,自然也進步不了。
common-client 很吃開發者抽象化的能力,我的預期是最後是一團比原來更看不懂的程式碼。
第三,裡面的 DateTime
範例嚇到我了,為了跨平台,連這種最基礎的元件都要再抽象化一層。拜託,處理時間的函式庫難寫的要死,抽象化做對更是難上加難。要應用程式開發者做這種事是不切實際的。
也許這只是個範例,不過 DateTime 在跨平台上現在 kotlin 還沒有解 (最近 1.2 版出了 kotlin 版的 Math,解決掉一小塊)。而且還有許多塊要解決,這也不知道哪天會完成。在尚未完成前,就很吃開發者的功力了。
data class Account (
val uid:Kuuid,
val createTime:KDateTime
)
上面是個隨便的帳號 data model ,如果 uid 設計成 UUID
,很顯然的每個平台的實作都有點不大一樣,kotlin 又沒提供,所以你只好自己刻一個 Kuuid
,然後下面的 KDateTime
也是同樣的意思...
這跟我想要的不大一樣啊....