2014-01-24 136 views
0

所以,單一職責原則 - 階級應該改變一個原因,而且只有一個原因,但是如何有效地判斷這個責任究竟是什麼。簡單的例子:S in SOLID - 你如何繪製線條?

public class UserManager 
{ 
    public void AddUser() { } 
    public void RemoveUser() { } 
    public void UpdateUser() { } 
} 

可以認爲,其中任何一個會打破SRP。所以,你最終用DI其中兩個與該結束了:

public class UserManager 
{ 
    private UserRemover _remover; 
    private UserUpdater _updater; 

    public UserManager(UserRemover remover, UserUpdated updater) 
    { 
     _remover = remover; 
     _updater = updater; 
    } 

    public void AddUser() { } 
    public void RemoveUser() { } 
    public void UpdateUser() { } 
} 

如果有關於用戶管理更多的方法?會沿着這條路走下去,並繼續在構造函數中傳遞額外的依賴關係?對於任何擁有一種以上公共方法的課程,可以認爲它打破了SRP。你有沒有使用常識,並選擇一個選擇,或者是純粹的,並選擇兩個選項?

+0

這是基於意見的,所以我投票結束。但如果有人告訴你選項2更好,我會感到震驚。這是極端迂腐。 – StilesCrisis

+1

答案不是基於意見的。答案是「它不會破壞SRP」。除非您有充分的商業理由以不同的方式移除不同的用戶,否則您不需要獨特的「UserRemover」。因此,讓他們保持在同一個班級,直到你遇到業務需求。只有這樣你才能重構插入新函數。 (記住敏捷的YAGNI原則。) –

回答

2

單一責任原則

A. UserManager的責任是什麼?

  1. 當您更新用戶時,您會做什麼?
  2. 當您移除用戶時,您會做什麼?
  3. 當你添加一個用戶時你會做什麼?

如果這些方法很簡單,那麼它們不會比在數據庫中更新用戶做得更多。也許UserManager的職責可能是UserRepository。

或者UserManager的責任可能更像是用戶列表。如果你看看List對象。它使用許多其他的子類嗎?沒有。如果這是你的情況,你應該重命名UserManager的UserList對象。

在這種情況下,您不確定SRP原則的主要原因是因爲MANAGER這個詞並不意味着任何特定的東西。嘗試找到一個更好的名字,你會找到你的答案。如果您的課程需要訪問更具體的對象,它會顯示在名稱中。

此外,您的單元測試應該有助於識別問題。單元測試是揭示這種奧祕的好方法。

此外,沒有純粹主義者會過度設計這種問題;)請記住,過早優化是所有惡的根源。