WORK STORY / 03
把 Folder Structure 提升成可執行規則
情境
當 Repository、Shared Packages 與產品數量逐漸增加後,我開始遇到另一種問題。
即使大家都知道:
- Component 應該放哪裡
- Business Logic 應該在哪一層
- Context、Hook、Service 各自負責什麼
不同工程師實作後,還是很容易形成不同的 Dependency Direction。
久了之後,Folder Structure 就只剩:
「檔案看起來放得很整齊」
但實際 Dependency 已經互相穿透。
例如 Component 直接碰 Service、底層模組反向依賴上層,甚至 Type Definition 放錯 Owner,都可能逐漸形成 Circular Dependency。
我的判斷與做法
所以我開始把 Folder Structure 從「資料夾命名規範」往 Architecture Rule 發展。
我重新定義各 Layer 的責任,例如:
- pages
- containers
- components
- hooks
- contexts
- services
- utils
並進一步定義它們之間允許的 Import Direction。
例如 Component 不應直接取得 Service;Context、Hook、Container 各自只能從特定 Layer 取得能力;TypeScript Type 也必須有明確 Owner,而不是為了方便到處引用。
這些關係除了用文件與 Dependency Diagram 描述之外,也逐漸透過 ESLint Rule 約束 Import,讓架構規則不只是寫給人看的說明。
形成的結果
Folder Structure 不再只是:
「這個檔案應該放在哪個 Folder?」
而開始回答:
「這個 Layer 應該知道哪些事情,又不應該知道哪些事情?」
團隊可以用同一套結構理解模組責任,也能在開發階段提早發現不合理的跨層 Dependency。
留下的思考
這也是我後來一直延續的觀念:
如果一條工程規則真的重要,就不應該只存在文件裡。
文件適合解釋「為什麼」,但能由工具判斷的事情,最好由工具直接判斷。
否則規範最後還是會變成工程師必須靠記憶維持的一套默契。