討論專案合理分層

congcong發表於2020-08-13

有時候寫著寫著程式碼,就會覺得自己寫的一團糟。覺得這兒也不合理,那兒也不合理。強迫症更是為了很小的一些東西糾結半天。

在此只是討論一下程式碼整體目錄結構的分層合理性,並不是什麼標準,也只是說一些自己的見解和大家一起討論。

controller

 當我們收到一個請求的時候,會先進入controller,那麼這層應該做什麼事情呢?我個人認為controller層應該做3件事情

1. 接收並驗證引數的基本型別正確性和引數的必須性
2. 呼叫logic,可以呼叫多個logic
3. 返回響應

我們應該在這一層驗證引數的基本正確性,而且只允許呼叫logic,可以呼叫多個logic進行配合完成最終的業務處理。至多寫個if else呼叫不做其它處理。

logic

logic層,分發控制邏輯層,只能被controller呼叫,這層應該做3件事情

1. 進一步驗證引數的正確性,比如是否存在資料,或者其他複雜邏輯的驗證
2. 呼叫service層,可以呼叫多個service實現具體業務,比如呼叫serviceA得到結果,再傳入serviceB獲取資料。
3. 返回結果

每個controller都應該對應一個logic,而且方法一一對應,這層我們用來進一步驗證引數的合法性,以及控制service層,使得彼此配合完成業務。這層只能呼叫service。而不能相互呼叫。

service

service層,具體的業務層,這層應該書寫詳細的邏輯處理,

1. 書寫具體邏輯,一般可以是被多次呼叫的。這層需要靈活的解耦,以便於logic呼叫。
2. 呼叫model層,model層應該只能被service呼叫。
3. 返回結果

service只能被logic呼叫,不能彼此呼叫

lib

現在還有一個問題就是,service層可能會相互依賴,比如serviceA依賴serviceB,或者同時logicA也依賴serviceB,那麼service是不應該互相呼叫的。我個人想法是在service層建一個lib。我們可以把serviceA依賴serviceB的方法提取出來,寫一個Trait亦或者是一個類。總之service的共用方法提取到lib裡面。這樣完成解耦。

model

model我覺得沒有爭議,就是和資料庫打交道。
最終目錄結構
Controller
Logic
Service
    --Lib
Models

總體流程就是 controller呼叫logic,logic呼叫service,service的彼此依賴提取到lib中,service呼叫model。這樣配合完成最終的處理。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章