Скажем, у нас есть функция, которая изменяет пароль для пользователя в системе в приложении MVC.
public JsonResult ChangePassword
(string username, string currentPassword, string newPassword)
{
switch (this.membershipService.ValidateLogin(username, currentPassword))
{
case UserValidationResult.BasUsername:
case UserValidationResult.BadPassword:
// abort: return JsonResult with localized error message
// for invalid username/pass combo.
case UserValidationResult.TrialExpired
// abort: return JsonResult with localized error message
// that user cannot login because their trial period has expired
case UserValidationResult.Success:
break;
}
// NOW change password now that user is validated
}
membershipService.ValidateLogin()
возвращает a UserValidationResult
перечисление, которое определяется как:
enum UserValidationResult
{
BadUsername,
BadPassword,
TrialExpired,
Success
}
Будучи защитным программистом, я бы изменил вышеописанный метод ChangePassword()
, чтобы выбросить исключение, если есть недопустимое значение UserValidationResult
от ValidateLogin()
:
public JsonResult ChangePassword
(string username, string currentPassword, string newPassword)
{
switch (this.membershipService.ValidateLogin(username, currentPassword))
{
case UserValidationResult.BasUsername:
case UserValidationResult.BadPassword:
// abort: return JsonResult with localized error message
// for invalid username/pass combo.
case UserValidationResult.TrialExpired
// abort: return JsonResult with localized error message
// that user cannot login because their trial period has expired
case UserValidationResult.Success:
break;
default:
throw new NotImplementedException
("Unrecognized UserValidationResult value.");
// or NotSupportedException()
break;
}
// Change password now that user is validated
}
Я всегда считал образец, похожий на последний фрагмент, выше лучшей практики. Например, что, если один разработчик получит требование о том, что теперь, когда пользователи пытаются войти в систему, если по этому-то-делому причинам они должны сначала обратиться в бизнес? Таким образом, определение UserValidationResult
обновляется следующим образом:
enum UserValidationResult
{
BadUsername,
BadPassword,
TrialExpired,
ContactUs,
Success
}
Разработчик меняет тело метода ValidateLogin()
, чтобы вернуть новое значение enum (UserValidationResult.ContactUs
), если это применимо, но забывает обновить ChangePassword()
. Без исключения в коммутаторе пользователю по-прежнему разрешено изменять свой пароль, когда их попытка входа в систему не должна быть проверена в первую очередь!
Это только я, или это default: throw new Exception()
хорошая идея? Я видел это несколько лет назад, и всегда (после того, как он это сделал) предположил, что это лучшая практика.