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

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

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

Войти через центр авторизации
Похожие вопросы
ProfitClicks Краснодар
от 80 000 руб.
от 160 000 до 210 000 руб.
IMAGINWEB Москва
от 55 000 до 85 000 руб.
16 июн. 2019, в 19:42
500 руб./за проект
16 июн. 2019, в 18:38
5000 руб./за проект
16 июн. 2019, в 17:14
5000 руб./за проект