2009-08-15 23 views
2

我一直沉迷於一個設計問題(臭編碼有點事情)幾天了。也許你可以幫忙。ASP.NET MVC:醜陋的代碼需要重構(返回三個值)

我有一個「登錄」法在我RegistrationService,目前它看起來簡化這樣的:

public Boolean Login(String username, String password, 
        out String successRedirectUrl, 
        out IValidationDictionary validationResults) 
{ 
    successRedirectUrl = ""; 
    if (!Validator.IsValid(username) || !Validator.IsValid(password)) return false; 

    // Other logic 
    // Distributed login requests etc. 
    // Build Redirect Url if login was successful etc. 
} 

好吧,讓我上面的代碼解釋。該方法的主返回值(布爾值)應該告訴調用者登錄請求是否成功。現在,如果成功,我需要將用戶重定向到不同的Url(因此,「out」參數successRedirectUrl)。如果不成功,我需要在視圖中告訴用戶哪裏出了問題 - 因此是ValidationDictionary(ModelState)。

這段代碼雖然很難看,但很難維護。我想擺脫布爾返回類型(直接返回successRedirectUrl並檢查調用者方是否爲空),但我覺得事情變得更加不清楚。

任何想法如何更好地做到這一點?

謝謝!

+1

我真的認爲你的意思是:s /繁殖/育雛。繁殖完全是另一回事;)。事實上,你已經爲你解決了這個問題。 – 2009-08-15 20:03:25

+0

哈哈你說得對,謝謝Joel :) – Alex 2009-08-16 06:55:39

回答

3

這個怎麼樣?

public class LoginOutput{ 

private bool _isLoginSuccess=false; 
public bool IsLoginSuccess{/*Usual get set block*/} 

private string _successRedirectUrl = String.Empty(); 
public string SuccessRedirectUrl{/*Usual get set block*/} 

public IValidationDictionary ValidationResultDict{/*Usual get set block*/} 
} 

//your method now could be 

public LoginOutput Login(string username, string password){ 
// your logic goes here 
} 
+0

你可以通過在另一種方法中重構該部分來處理字典內容。將會更可測試 – Perpetualcoder 2009-08-15 20:32:32

9

製作一個自定義類來保存所有三個值,並將其返回。擺脫「out」參數。

+0

這就是面向對象編程的全部內容。 – DOK 2009-08-15 20:04:16

1

問題:

是重定向URL不同用戶的不同? - 我想說它不應該是,但如果它不同,決定不應該在你的業務層。這是UI邏輯,應該在那裏。

什麼是您的IValidationDictionary界面?你可能只是在你的UI邏輯直接使用它:

public IValidationDictionary Login(string user, string password); 

var user = "bob"; 
var validator = Login(user, "password"); 

if (validator.IsValid) 
    Response.Redirect(GetUserPage(user)); 
else 
    HandleLoginError(); 

注意GetUserPage()不應該是一個數據庫查詢或其他任何複雜。再次,這應該是簡單的UI邏輯,類似於:

public string GetUserPage(string user) 
{ 
    return "/MyPage/" + user; 
} 
+0

是的,不同用戶的重定向URL是不同的。 – Alex 2009-08-16 06:57:37