Как лучше разбить логику?

Допустим речь идет об авторизации, к которой относятся и вход, и регистрация, и сброс пароля. Эти 3 части описать в отдельных классах, или методами в одном классе? Пытаюсь понять SRP
  • Вопрос задан
  • 1492 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Пытаюсь понять SRP


Давайте думать. Вот есть у вас класс который:

- занимается аутентификацией пользователя
- занимается регистрацией пользователя
- занимается восстановлением пароля

На лицо три сценария использования, три зоны ответственности. Причем каждая из этих фич может быть реализована отдельно друг от друга, отдельно друг от друга протестирована и изменения могут быть в каждой из этих вещей.

С другой стороны, давайте думать дальше. Если мы поместим все эти операции в рамках юзера - то как бы... все клево) юзер умеет менять свой пароль, юзер умеет логиниться, а регистрация - это просто создание нового юзера. То есть с точки зрения ООП все круто, и нам не нужно ломать инкапсуляцию юзера. Да, юзер много чего будет уметь и возможно даже знать о чем-то о чем не особо должен - но это уже решается инверсией зависимостей и делегированием.

Давайте думать дальше... например та же регистрация как минимум требует отдельного класса, который будет содержать логику регистрации. Нам же помимо создания юзера надо email ему отправить, а возможно еще что-то сделать.

p.s. маленький вброс: https://gist.github.com/fesor/33f041e3f362beff8d0e...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Имеет ли смысл плодить классы только ради строгого соблюдения SRP?
Попрубйте реализовать оба варианта и прикинуть, с чем в будущем будет удобнее работать.
Ответ написан
@tosha_lol_daaa
Банально: AuthController где существуют нужные методы(но "сброс пароля" я бы вынес в отдельный контроллер)
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
На мой взгляд указаные функции относятся к работе с учетной записью и разделять их не нужно. Выглядеть это может как-то так:
AccountManager.is_account_available_for_username(..)
AccountManager.create_new_account_with_uname_and_pw(..)
AccountManager.remove_authentication_for_user(..)
AccountManager.log_in_user(..)
AccountManager.is_user_logged_in(..)

Принадлежность этих функций классу АccountManager мне видится логичной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы