2014-05-07 171 views
1

我有一個服務/經理類,我從數據源中獲取用戶。這些方法是模擬流程,但有不同的檢索方法。如何刪除流邏輯的重複?

public User GetByUserName(string userName) 
    { 
     user = dependencyResolver.UserRepository.GetByUserName(userName); 

     if (user == null) return null; 

     AddStuffToUser(); 

     return user; 
    } 

    public User GetById(int id) 
    { 
     user = dependencyResolver.UserRepository.GetById(id); 

     if (user == null) return null; 

     AddStuffToUser(); 

     return user; 
    } 

    public User GetByUserName(string userName, string encryptedPassword) 
    { 
     user = dependencyResolver.UserRepository.GetByUsernameAndPassword(userName, encryptedPassword); 

     if (user == null) return null; 

     AddStuffToUser(); 

     return user; 
    } 

我想刪除的流程邏輯的重複,但我不能找到滿意的設計。我可以通過使用OOP來實現,但我認爲這對於這樣一個簡單的任務來說增加了很多複雜性。我也嘗試將提取方法作爲Func<>參數傳遞,但由於提取方法具有不同的參數,所以我沒有把它做對。

哪些這裏是我的選擇嗎?

+0

我讀過直到該行:'user = dependencyResolver.UserRepository.GetByUserName(userName);'你在哪裏違反demeter的法則。首先修復它 –

+0

有趣的評論@AlmaDo。 'dependencyReslover'只返回存儲庫接口。我可以寫'IUserRepository userRepository = dependencyResolver.UserRepository; userRepository.GetByUserName(userName);''dependencyResolver'被傳遞給服務的構造函數。我知道我不應該相信朋友的朋友,但是'dependencyResolver'和'UserRepository'更像是朋友而不是朋友。我可以相信一個朋友的兄弟,或者這仍然違反德米特法嗎? – FatAlbert

+0

我相信你想要做的是封裝一個[橫切關注](http://en.wikipedia.org/wiki/Cross-cutting_concern)。請注意,在這一點上你實際上已經超越了OOP領域並進入了AOP領域。 –

回答

0

取代:

if (user == null) return null; 

     AddStuffToUser(); 

     return user; 

有:

return doXYZ(user); 

,並添加:

private User doXYZ(User user){ 
    if (user != null){ 
     AddStuffToUser(); 
     return user;} 
    return null; 

在這點u放置6行9和更好的代碼風格(OOP-標準是有用的在任何任務)

+0

感謝您的回覆。問題中的例子很簡單,可以 - 如您所建議 - 重構。但是,我正在尋找一個更通用的解決方案,以便在您希望刪除流邏輯的重複時使用。 – FatAlbert