Скажите, не спрашивайте принцип и срок действия пароля - PullRequest
7 голосов
/ 26 марта 2012

Пытаясь придерживаться прагматических принципов программирования, я пытаюсь решить, как обрабатывать изменения пароля пользователя, основываясь на принципе «Говори, не спрашивай».

У меня есть объект пользователя, срок действия пароля которого истекает каждые 30 дней. Я должен быть в состоянии показать пароль истек / изменить пароль, если срок действия пароля истек. Запрос объекта, если срок действия пароля истек (его состояние), а затем выбор вида для отображения, кажется нарушением принципа.

Как лучше всего справиться с этой ситуацией?

Ответы [ 5 ]

4 голосов
/ 27 марта 2012
login
   model.validate();
   return model.show(self);

passwordExpired()
  return View("ChangePassword")

loginSuccess()
  return View("default")

class User
  show(aController)
      if passwordExpired
          return aContoller.passwordExpired()
     else return aContoller.loginSuccess()

Скажи, не спрашивай, без исключений, и он подчиняется закону Деметры

3 голосов
/ 26 марта 2012

Вы должны рассмотреть вопрос о том, чтобы пользовательский объект имел метод Validate (), который предоставляет логическое значение (как в контракте с поставщиком членства), или рассмотрите возможность использования метода Validate (), возвращающего какое-то перечисление, которое указывает результат проверки ( ОК, INVALID_PASSWORD, EXPIRED_PASSWORD и т. Д.).

Есть много вариантов - исключение не должно быть одним из них, если срок действия пароля истек. Это плохая форма, а также снижение производительности, так как среда выполнения должна разматывать стек.

3 голосов
/ 26 марта 2012

Вы можете выдать исключение PasswordExpired из объекта пользователя, когда пароль аутентифицирован, или любую функцию, которую вы сначала вызываете для пользователя.

1 голос
/ 27 марта 2012

Мне лично не нравится программировать возвращаемые значения / Enum типы.Чем больше типов возврата у вас есть, тем больше путей вы должны протестировать / использовать.Кроме того, использование исключений для управления потоком является плохой практикой (если вы действительно не можете найти какой-либо другой вариант, но обычно есть лучший вариант).

Истек срок действия пароля не является для меня действительно исключительным.В конце концов, это действительное состояние (в противном случае вы могли бы что-то сделать с паролями, срок действия которых вообще не истекает)напрямую вызывается вызывающим абонентом.

Возможно, что-то подобное:

public class User
    {
        private DateTime _lastChangeDate;
        public Action Validate()
        {
            if (_lastChangeDate >= DateTime.Now.AddDays(-30))
            {
                return new Action(() => this.Login());
            }
            else
            {
                return new Action(() => this.ChangePassword());
            }
        }
        private void Login()
        {
            Console.WriteLine("Login");
        }
        private void ChangePassword()
        {
            Console.WriteLine("Change Password");
        }
    }

На стороне вызывающего абонента:

user.Validate().Invoke();
0 голосов
/ 26 января 2013

Одним из способов решения этой проблемы является моделирование ОО, например:

public class Login {

private String userName;
private String password;
private Date expirationDate;    

public void authenticate(String password) {
    if (this.password.equals(password) {
        redirectoToMainOrEditPage();
    } else {
        redirectToFailPage();
    }
}

private void redirectToMainOrEditPage() {
    Date today = new Date();

    if (today.before(expirationDate)) {
        redirectToMainPage();
    } else {
        redirectToEditPage();
    }
}

private void redirectToMainPage() {
    ...
}

private void redirectToEditPage() {
    ...
}

private void redirectToFailPage() {
    ...
}

public void changePassword(String newPassword) {
    ...
}

public void changeExpirationDate(Date newDate) {
    ...
}
}

Таким образом, вы ничего не спрашиваете к другим объектам домена, а указываете Login для аутентификации, так как он имеет все необходимое для выполненияэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...