設計應用程序層不是微不足道的。在一天結束時,我們在每個項目中都編寫(大量)所謂的業務方法(有時稱爲服務方法,儘管它與公共API中的服務無關)執行一些業務邏輯的方法通常會執行一些數據庫/存儲操作(通過存儲層)。但是,設計/組織/命名你的應用程序方法並不是微不足道的,人們通常對項目應該如何設計應用程序類和方法有規定。我找了一套實用的設計應用層這樣的規則,所以這裏有一些問題:設計應用程序層 - 您最佳實踐是什麼?
分組方法類:返回類型或?
例如,更新用戶的方法屬於類,例如
UserService
。或者通過某些標準查找用戶的方法屬於同一個類。但是,當某種方法適用於多種類型時會發生什麼,例如registerUserForCompetition()
?這應該在UserService
或CompetitionService
?方法findUserCompetition()
的相同問題 - 你會在哪裏放?我經常看到一個規則,說這取決於方法的返回類型。在我們的示例中,如果方法返回
User
(或用戶等的集合),它應該屬於UserService
。方法參數:簡單類型(原始類型,字符串...)或實體(例如User
,Competition
,Registration
...)?這個問題經常被問到,人們通常(統計:)選擇第一種方法,使用簡單的類型作爲服務參數。但是當一個這樣的方法在同一個資源上調用另一個方法時該怎麼辦?讓我舉個例子:
registerUser(userId, competitionId)
可能會在內部呼叫checkCompetition(competitionId)
。兩種方法都從存儲中獲取Competition
。顯然,這是兩次完成的,因爲我們已經有了Competition
對象,所以我們可以使用它到checkCompetition
。所以我們應該添加重載的方法,或者我們應該忽略這一點,並真正在緩存機制,以防止雙重抓取?另一方面,具有完整類型作爲參數不能是通用規則,因爲不需要全部信息的次數很多,並且沒有理由在您需要的時候獲取完整對象,而您已經可以有它。
命名方法:如何詳細的方法名稱應該是?
尤其適用於查找方法。如果我們已經例如:
findCompetition(userId, year)
或findCompetitionWithVenue(userId, year)
(因爲每個Competition
對象鏈接Venue
);或findCompetitionForUserAndYear(userId, year)
或findCompetitionByUserIdAndYear(userId, year)
或只是findUserCompetitionForYear(userId, year)
?
當不同標準的數量增加時,很容易弄亂查找方法名稱,並且我經常看到像這樣的規則:
find<return-type>By<names-of-parameters>
或類似的規則。您是否有應用程序類的命名約定?
你的班級名字以
Service
結尾嗎?您是否將經理與服務分開,其中經理處理實體和服務只接受簡單類型?你是否將所有業務類別歸入同一個包中,或者將它們與其他相關類(模型,控制器...)一起按功能分組?
請分享注重務實的經驗 - 這對我來說意味着新的開發者可以很容易地計算在哪裏可以找到商業方法,以及如何編寫新的,所以每個人都更富有成效。另外,如果您已經制定了規則,請分享您的團隊如何管理他們。
這個問題是概念性的,屬於程序員.stackexchange.com。一旦遷移,這將是一個很好的問題。 –
http://programmers.stackexchange.com/questions/233743/designing-service-methods-what-is-your-best-practice – igr