我们与同事讨论了流控制和通用代码设计的模式。需要您的意见-哪种是编写代码的更好/更干净/更好的方式?

这是针对MVC 3的,但这并不重要。
版本1:

public ActionResult Login(LoginData loginData)
{
    if (!ModelState.IsValid)
    {
        ShowGlobalError("Invalid credentials.");
        return View(loginData);
    }

    UserProfile profile = null;
    try
    {
        // see if we have profile with those credentials
        profile = this.RetrieveUserProfile(loginData.Email.Trim(), loginData.Password.Trim());  // this just goes to db and tries to get user profile. Returns null if profile isn't found
    }
    catch (Exception ex)
    {
        ShowGlobalError("DB is down");
        LogError(...);
        return View(loginData);
    }


    if (profile == null)
    {
        // nope, we don't.. ask again
        ShowGlobalError("Invalid credentials.");
        return View(loginData);
    }

    // ok, we're good
    Session["Profile"] = profile;
    FormsAuthentication.SetAuthCookie(profile.Email, false);
    FormsAuthentication.RedirectFromLoginPage(profile.Email, loginData.EnablePermanentCookie);

    return View(loginData);
}


版本2:

public ActionResult Login(Credentials credentials){
    try{
        PersonalProfile profile = AuthenticateUser(credentials);
        SetProfileSessionstate(profile);    // this does 'Session["Profile"] = profile;'
        SetFormsAuthenticationAndRedirect(profile);
    }
    catch(Exception ex){
            ShowGlobalError("invalid login, please try again.");
    }
    return View(credentials);
}

public void SetFormsAuthenticationAndRedirect(PersonalProfile profile){
     FormsAuthentication.SetAuthCookie(profile.Email, loginData.EnablePermanentCookie);
     FormsAuthentication.RedirectFromLoginPage(profile.Email, loginData.EnablePermanentCookie);
}


版本1充满返回语句,版本2使用try / catch进行流控制。
因此,哪种方法更好,还是我们都做错了,还有一种更好的共享方式?

谢谢 !

最佳答案

我喜欢#1比#2好得多

2号是惰性编码

1号明确捕获错误

依靠异常来捕获逻辑错误或错误不是一个好主意
在#2中,如果profile为null,则无需检查并依靠抛出异常来捕获异常通常是昂贵的操作
并且仅应用于不可预见的逻辑结果(例外!)

关于c# - 流控制模式和最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5261077/

10-11 00:55