Один и тот же интерфейс несколько раз в конструкторе - PullRequest
0 голосов
/ 02 апреля 2020

Я создал интерфейс IValidator и несколько классов, которые реализуют этот интерфейс, как вы можете видеть на картинке. У меня есть класс UserAccountManager, который управляет учетной записью пользователя - создает новую учетную запись, изменяет данные профиля, изменяет пароль и т. Д. c ... Проблема заключается в том, что в некоторых случаях мне нужно проверить ввод пользователя (смена пароля, регистрация ...), и я нужно несколько валидаторов для этого. Я не думаю, что этот дизайн хорош из-за нескольких валидаторов в конструкторе. Есть ли лучший подход?

enter image description here

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Валидаторы обычно реализуются как один класс, но с несколькими правилами, которые можно настраивать динамически. PHP пример:

 Validator::make($data, [
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);

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

0 голосов
/ 02 апреля 2020

Вы можете инкапсулировать валидаторы в один объект или коллекцию (список или массив), чтобы конструктор получил один параметр.

.............................
..+---------------------+
..|....<<class>>........|
..|....ValidatorGroup...|
..+---------------------+
..|..[+]..void.RegisterValidator..|
..|.......(IValidator..NewValidator)...|
..|..[+]..void.Validate(..)...|
..+---------------------+
.............................
..+--------------------------+
..|.........<<class>>........|
..|....UserAccountManager....|
..+--------------------------+
..|..[+]..UserAccountManager..<<constructor>>..|
..|.......(ValidatorGroup..NewGroup)...|
..+--------------------------+
..|..[+]..void..ChangePassword.(..)..|
..|..[+]..void..RegisterNewUser.(..)..|
..+--------------------------+
.................................

Вы также можете избежать назначения валидаторов в конструкторе, и добавьте их как одно свойство.

...