@oop_ru

Страница 214 из 785
Andrey
08.05.2017
13:45:32
Смену пароля надо в user, т.к. это просто один из атрибутов user, но здесь только смена, отправка нотификаций и прочее - за пределами user

Google
Sergey
08.05.2017
13:46:20
$this->remember(new PasswordChanged($this));

и вешаем потом лисенер на доменные ивенты

итого допустим нам надо реализовать следующую логику: - пользователь может сменить пароль только если ввел корректный старый - новый пароль юзера не должен совпадать с 5-ю последними

куда бы ты чего пихал?

Andrey
08.05.2017
13:50:19
В пользователе только смена, ar мне не нравится, поэтому сохранение в репозиторий, а все проверки до фактической смены в отдельном сервисе

Sergey
08.05.2017
13:50:57
Andrey
08.05.2017
13:51:08
Надо сменить проверки - меняем только сервис, остальное без изменений

Sergey
08.05.2017
13:51:25
что бы собрать логику этого простого флоу надо попрыкать по классам

Andrey
08.05.2017
13:52:20
Давай начнём с самого начала - зачем нужны паттерны? Точнее для чего они?

Sergey
08.05.2017
13:52:55
которые нарушают O/C

Andrey
08.05.2017
13:53:14
Это кто сказал? ))) не верь ему )

Google
Sergey
08.05.2017
13:53:23
и потом расскажи как ты будешь покрывать юнит тестами все это дело

Andrey
08.05.2017
13:54:37
Паттерны - это решение какой-либо проблемы. If/else - это частный случай, т.к. они тоже являются проблемами

Алексей
08.05.2017
13:55:21
Это кто сказал? ))) не верь ему )
Верить вам или людям с опытом работы в 10-20 лет в индустрии.. хм... сложно выбрать.

Andrey
08.05.2017
13:56:08
Юнит - легко, у меня может быть несколько аутентификации и каждая будет протестирована, каждую можно будет использовать и это легко поддерживать

Верить вам или людям с опытом работы в 10-20 лет в индустрии.. хм... сложно выбрать.
Кто сказал? Вопрос был таким, я могу ссылки дать где про проблемы сказано, но только завтра вечером минимум, сейчас не дома, с телефона лень )

Sergey
08.05.2017
13:57:24
Паттерны - это решение какой-либо проблемы. If/else - это частный случай, т.к. они тоже являются проблемами
твое определение мягко скажем размыто настолько что не понятно зачем они нужны

мое любимое определение - паттерны это способы избавления от switch

"какие-то проблемы" это нарушение open/close принципа

Sergey
08.05.2017
13:58:32
симптомами нарушения OCP являются свитчи, ифы и new

Sergey
08.05.2017
13:58:55
вывод, паттерны способ убрать switch/if/new и добиться соблюдения OCP

только и всего?
ну тип того.

кроме юзера пароля никто не знает

Andrey
08.05.2017
13:59:45
вывод, паттерны способ убрать switch/if/new и добиться соблюдения OCP
Это частный случай, он не должен распространяться на все, т.к. ограничивает применение

Sergey
08.05.2017
13:59:47
предлагаешь инкапсуляцией пожертвовать?

Алексей
08.05.2017
14:00:04
вывод, паттерны способ убрать switch/if/new и добиться соблюдения OCP
Я вот не согласен с таким определением. Да они помогают избавлятся от if/else но они не для этого

Google
Sergei
08.05.2017
14:00:12
кроме юзера пароля никто не знает
т.е. речь о авторизации сейчас или о вводе пользователя?

Andrey
08.05.2017
14:00:42
кроме юзера пароля никто не знает
Он тоже пароль не знает, пароль хеширован (если на всякий случай не хоронить и открытую версию)))

Sergey
08.05.2017
14:00:47
т.е. речь о авторизации сейчас или о вводе пользователя?
только юзер знает какой у него сейчас пароль. Соответсвенно он должен решать правильно он введен или нет

Я вот не согласен с таким определением. Да они помогают избавлятся от if/else но они не для этого
оно конечно сильно упрощено, но это намного лучше чем "решение какой-то проблемы"

Sergei
08.05.2017
14:01:17
только юзер знает какой у него сейчас пароль. Соответсвенно он должен решать правильно он введен или нет
Ну это да, а если я хочу поменять пароль и насетить вместо старого пароля ерунду какую нибудь?

Sergey
08.05.2017
14:01:41
Ну это да, а если я хочу поменять пароль и насетить вместо старого пароля ерунду какую нибудь?
передаешь аргументом штуку которая занимается этими вещами и готовит хэш

Д - делегирование ответственности

Sergei
08.05.2017
14:02:42
Andrey
08.05.2017
14:02:44
В примере её не было и я писал - если проверка отдельно - проблемы большой не вижу, но в примере она захардкожена была

Andrey
08.05.2017
14:03:08
Мы про пример говорим

Sergey
08.05.2017
14:03:12
но если подумать: - поведенческие паттерны - избавляют нас от if/switch - порождающие - от new

со структурными не все так просто но в конечном итоге всеравно от if избавляют и позволяют добиться OCP

?
08.05.2017
14:03:52
Но полностью от if'ов же не избавиться?

Это не реально

Sergey
08.05.2017
14:04:25
Но полностью от if'ов же не избавиться?
так не в этом цель. цель добиться OCP

(ну и другие SOLID принципы тоже)

Andrey
08.05.2017
14:04:43
Если подумать - код только из if и состоит ))) но проблема не в них, а в поддержке этого кода

Google
Sergey
08.05.2017
14:05:22
https://gist.github.com/fesor/f5e2df605315f12eab3aaa01b80e7442

придумай мне кейсы при которых мне надо будет поменять этот код

раз уж мы про SRP начали

?
08.05.2017
14:05:58
Кто-то говорил, что static - это..

не круто)

Sergey
08.05.2017
14:06:28
Кто-то говорил, что static - это..
статический стэйт плохо, чистые статические методы норм

мы же от сайд эффектов и глобального стэйта спрятаться хотим

?
08.05.2017
14:07:01
if (!password_verify($this->password, $oldPassword)) { throw new IncorrectPasswordError(); } повтор кода

Sergey
08.05.2017
14:07:17
и найди там повтор

Admin
ERROR: S client not available

Sergey
08.05.2017
14:07:32
и еще оцени профит от устранения такого дублирования

я профита не вижу

DRY не о том что бы маниакально убирать дублирование, он о том что бы логика не дублировалась

Andrey
08.05.2017
14:07:57
придумай мне кейсы при которых мне надо будет поменять этот код
Пароль не должен быть простым, пароль хэшируем, пароль хэшируем методом из конфига. Самое простое

Sergey
08.05.2017
14:08:01
у тебя может быть два абсолютно одинаковых класса но использующихся в разных контекстах.

Andrey
08.05.2017
14:08:34
В конфиге указано чем хэшировать ))

Sergey
08.05.2017
14:08:46
public function changePassword(string $oldPassword, string $newPassword, PasswordHasher $hasher);

Google
Andrey
08.05.2017
14:08:50
Или в другом классе

Sergey
08.05.2017
14:08:59
В конфиге указано чем хэшировать ))
ну у тебя и так password api по сути из конфига берет

Andrey
08.05.2017
14:09:08
Раз уже изменили ))

Sergey
08.05.2017
14:09:10
но вот я выше дал тебе пример как делигировать это

Раз уже изменили ))
короч SRP = single reason to change.

Andrey
08.05.2017
14:10:41
Так вот для этого и rsp, чтобы не менять 100 классов, а просто добавить один и передать его там где он нужен. А мы уже на один больше изменили. Последний пример мне нравится больше

Andrey
08.05.2017
14:11:02
Sergey
08.05.2017
14:11:31
SRP о том что в ЗАВИСИМОСТИ от контекста и характера изменений мы должны делить объекты определенным образом с позиции того кто будет использовать нужное поведение

changePassword и authenticate имеют одни и те же причины для изменений

логика проверки хэша и валидации пароля может быть делигирована другим объектам

но главное

инкапсуляция не нарушена

Andrey
08.05.2017
14:12:43
это называется преждевременной оптимизацией
Возможно, у меня бы был класс в котором этот же код из user, надо изменить - изменил бы его. У меня меньше изменений потребовалось бы, про это паттерн и говорит

Sergey
08.05.2017
14:12:54
и как бы положил новый?

и скажи как это будет выглядеть с точки зрения инкапсуляции?

еще одна проблема твоего подхода

будет у нас например еще пяток бизнес правил для логина

небольших каких

аля "если чувак 3 раза ввел пароль не правильно - надо залочить аккаунт"

и допустим у нас есть на все это отдельные сервисы, декораторы и прочее

Страница 214 из 785