昨天決定另開 repo 重寫。第一個要回答的問題不是「用什麼函式庫」,而是:程式碼要怎麼切,才能同時滿足三件事?
三件事其實指向同一個答案:把「產品無關」與「產品專屬」在模組層級分開,而不是靠 package 命名自律。
| 選項 | 做法 | 優點 | 代價 |
|---|---|---|---|
| A. 單一模組 + package 分層 | ui/ data/ di/ 三個 package,靠 code review 守邊界 |
最快上手;建置設定最少 | 邊界靠自律,三個月後一定破;抽出公開範例要手動挑檔案;跨產品覆用等於複製貼上 |
| B. 多模組,依「技術層」切 | :ui :domain :data 三個模組 |
依賴方向清楚 | 每加一個功能要動三個模組;:ui 會再度長成 God module;平台能力(藍牙、相機)沒有自然的家 |
| C. 多模組,依「功能 + 平台能力」切 | app → feature:* → data → core:* |
功能可獨立編譯與測試;core 天生產品無關;抽公開範例 = 複製 core/ |
建置設定前期投資約一天;模組數多,需要 convention plugin 管理 |
假設,我的 App 想要有登入、首頁、帳戶設定頁 3 頁。
我的根目錄先這樣切分資料夾結構:
-login
-home
-account
我已把程式碼用資料夾分類,這樣是否能稱作我的專案已模組化了?
不是。因為僅僅把程式碼分類,並無法形成模組邊界。
也就是說,在沒模組邊界。的情況下,打包腳本不會認定上述的三個資料夾是個別的獨立元件。
| 分類方式 | 作用 |
|---|---|
| 資料夾 | 整理檔案 |
| package | 整理命名空間 |
| module | 控制依賴與可見範圍 |
最簡單的一句話是:
資料夾是在分類程式碼;模組是在隔離程式碼。
package 是在表達 Class、檔案的結構,讓程式碼更佳的組織化及利於搜尋。