Допустим, у нас есть функция, которая изменяет пароль для пользователя в системе в приложении 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()
возвращает перечисление 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()
для возврата нового значения перечисления (UserValidationResult.ContactUs
), когда это применимо, но забывает обновить ChangePassword()
. Без исключения в коммутаторе пользователю все еще разрешено менять свой пароль, даже если попытка входа в систему вообще не должна быть проверена!
Это только я, или это default: throw new Exception()
хорошая идея? Я видел это несколько лет назад и всегда (после этого) считал, что это лучшая практика.