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