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

Допустим речь идет об авторизации, к которой относятся и вход, и регистрация, и сброс пароля. Эти 3 части описать в отдельных классах, или методами в одном классе? Пытаюсь понять SRP
  • Вопрос задан
  • 1486 просмотров
Решения вопроса 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 мне видится логичной.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 19:22
18000 руб./за проект
25 апр. 2024, в 19:21
10000 руб./за проект
25 апр. 2024, в 18:47
2795100 руб./за проект