2009-08-15 1 views
2

私は数日間、設計上の問題(臭いコードのようなもの)をうろついています。多分あなたが助けることができます。ASP.NET MVC:醜いコードはリファクタリングを必要とします(3つの値を返す)

私は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/breeding/brooding。繁殖は全く別のものです;)。実際、そこにはあなたのためにそれを固定しています。 –

+0

あなたは正しいです、ありがとうJoel :) – Alex

答えて

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

9

3つの値をすべて保持するカスタムクラスを作成して返します。 「out」パラメータを取り除く。

+0

これは、オブジェクト指向プログラミングのすべてについてです。 – DOK

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

関連する問題