[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка уникальности сущности в рамках DDD
Страницы: 1, 2, 3, 4, 5
twin
Цитата (Invis1ble @ 10.02.2018 - 06:23)
Это Value Object, причем реюзабельный.
Хорошо, пусть будет VO. Хотя в данном случае одно другого не отменяет.

Так еще хуже получается. Вот смотри. Я запускаю твою фабрику и получаю валидный объект:
$checker = new UsernameAlreadyRegisteredChecker();
$usernameFactory = new UsernameFactory($checker);

$username = $usernameFactory->createUsername('John');

Меняю имя в сущности User (опускаем рефлексию, простая идентификация):
(new User($userId))->changeUsername($username);

Потом повторяю операцию с тем же именем, но с другим ID. Имеем дубль имени. Скорее всего ты опустил что то типа
$this->checker->addStorage((string)$instance);
перед ретурном в createUsername()

Но я не этого не понимаю. Не могу понять профита от фабрики и VO, если все тоже самое можно сделать в одном классе, обозвав его к примеру CreateUsername, сделав конструктор публичным и добавив сеттер ченджер. В чем фишка?

Цитата
Такие вопросы должны разруливаться на инфраструктурном уровне, в контексте доменного слоя об этом говорить не уместно, имхо.
Но ты же сам писал про защиту от дурака:
Цитата (Invis1ble @ 8.02.2018 - 09:59)
Но тогда у нас нет уверенности, что клиент не забудет вызвать валидацию.
Только не забудет про валидацию, а забудет сохранить новое имя в storage

Тут похожий принцип.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Всё, дошло. Как до жирафа)) Фишка в том что User не примет ничегo, кроме Username $username
Вобщем то прикольно, но уж больно наварочено. Неоправдано сложно на мой взгляд. И главное, не совсем понятна цель. Писать такие "агрегаты" smile.gif ради защиты от дурака... Не слишком ли много чести...

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
в application layer есть сервис, который отвечает за регистрацию пользователя

$username = $this->usernameFactory->createUsername($command->username);
$user = User::register(new UserId($command->userId), $username);

$this->userRepository->save($user);


так что всё прекрасно сохраняется.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Invis1ble
Цитата (twin @ 10.02.2018 - 11:39)
Всё, дошло. Как до жирафа)) Фишка в том что User не примет ничегo, кроме Username $username
Invis1ble
Цитата (twin @ 10.02.2018 - 11:39)
Писать такие "агрегаты" smile.gif ради защиты от дурака... Не слишком ли много чести...

Если ты Hello World пишешь, или бложик - то DDD вообще не нужно.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (Invis1ble @ 10.02.2018 - 07:47)
в application layer есть сервис, который отвечает за регистрацию пользователя
Осмелюсь предположить, что есть сервис, который меняет имя? Там тоже
Цитата (Invis1ble @ 10.02.2018 - 07:47)
так что всё прекрасно сохраняется.
Получается, что на любой чих нужно сохранять объект User в репозитории и доставать его снова. Хм...
Интересно посмотреть на реализацию UsernameAlreadyRegisteredChecker

Цитата (Invis1ble @ 10.02.2018 - 07:53)
Если ты Hello World пишешь, или бложик - то DDD вообще не нужно.
Это детский аргумент из области старых холиваров OOП vs процедуры. Тоже считалось, что без ООП большой проект не сделать. А сейчас, когда вошла в моду слоистая архитектура, сервисы по сути стали процедурными. Я уже про мидлвары молчу smile.gif

Теперь в DDD ударились. DDD, это стратегическое проектирование, к нашему разговору имеет опосредствованное отношение. Или ты считаешь, что без защиты от дурака нельзя соблюдать принципов DDD?

И вообще, ты знаешь, что есть куча народу, которая придерживается принципа анемичных моделей, а они противоречат не только принципам DDD, но и ООП в целом. Не думаю, что все они пишут Hello World.

Так что это не аргумент. Хотя я же не говорил, что DDD отстой. Мне не нравится, ну и что теперь. Или ты хочешь сказать, что я одни бложики пишу? smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
Цитата (twin @ 10.02.2018 - 12:30)
Получается, что на любой чих нужно сохранять объект User в репозитории и доставать его снова. Хм...

Какой еще "любой чих"? Если у тебя в предметной области пользователь имеет возможность поменять своё имя, то как ты без сохранения это сделаешь? Или ты в процедурном стиле не напишешь где-то UPDATE в случае с РБД?

Цитата (twin @ 10.02.2018 - 12:30)
Интересно посмотреть на реализацию UsernameAlreadyRegisteredChecker

Это либо репозиторий, либо сервис, имеющий доступ к репозиторию.

Цитата (twin @ 10.02.2018 - 12:30)
Это детский аргумент из области старых холиваров OOП vs процедуры.

Ты спросил, нужно ли писать столько кода - я ответил, что для проектов с несложной бинес-логикой не только не нужно писать столько кода, но и вообще DDD не уместно. Я не знаю, что ты там себе нафантазировал.

Цитата (twin @ 10.02.2018 - 12:30)
DDD, это стратегическое проектирование, к нашему разговору имеет опосредствованное отношение.

Какое еще опосредованное значение? Название темы прочти. Это тебя несёт в сторону похоливарить, а тема про DDD и как лучше спроектировать конкретный участок системы.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (Invis1ble @ 10.02.2018 - 08:51)
Я не знаю, что ты там себе нафантазировал.
Ничего не фантазировал. Написано недвузначно, что без DDD можно писать только бложики. А это не так.
И для сложных проектов защита от дурака, это вовсе не обязательное условие. И именно это я и мел ввиду, когда писал про опосредованное отношение. Не обязательно это вовсе. И размер проектируемого приложения тут не играет никакой роли. Хочешь DDD - ради бога. Не хочешь, ничего криминального.

Я просто высказал свое имхо, что для одной только защиты от дурака такой наварот - много чести. Но дело твое. Идея понятна, вопросов нет, ты нашел подходящее решение - я рад за тебя.


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
Цитата (twin @ 10.02.2018 - 13:04)
Не обязательно это вовсе.

Так же как и php не обязателен. Однако, как ты мог заметить, мы находимся на форуме phpforum и прямо сейчас разбираем код на php smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (Invis1ble @ 10.02.2018 - 09:07)
Однако, как ты мог заметить, мы находимся на форуме phpforum и прямо сейчас разбираем код на php
Причем тут PHP))) Я про то, что слишком все усложняется. Если хочешь аналогию с форумом, то написать Привет мир! можно через echo, а можно задействовать TWIG. Просто ты говоришь, что большого проекта без TWIG не построить. А я говорю - херня, можно обойтись нативом. smile.gif
Цитата (Invis1ble @ 10.02.2018 - 08:51)
Какой еще "любой чих"? Если у тебя в предметной области пользователь имеет возможность поменять своё имя, то как ты без сохранения это сделаешь?
Никак. Но я не про это. Я про то, что любой сервис должен начинать работу с того, что достать объект из репозитория, а закончивать тем, что положить его обратно (если он мутировал). Не передавать его друг другу напрямую, только через репозиторий (скорее всего БД). Иначе вся твоя защита не стоит выкушеного яйца. Я так не писал никогда, просто могу представить себе наклдные расходы..

Это риторический памфлет, не принимай близко к сердцу. smile.gif У каждого свои бзыки свой путь.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
Цитата (twin @ 10.02.2018 - 13:22)
Цитата (Invis1ble @ 10.02.2018 - 09:07)
Однако, как ты мог заметить, мы находимся на форуме phpforum и прямо сейчас разбираем код на php
Причем тут PHP))) Я про то, что слишком все усложняется. Если хочешь аналогию с форумом, то написать Привет мир! можно через echo, а можно задействовать TWIG. Просто ты говоришь, что большого проекта без TWIG не построить. А я говорю - херня, можно обойтись нативом. smile.gif
Цитата (Invis1ble @ 10.02.2018 - 08:51)
Какой еще "любой чих"? Если у тебя в предметной области пользователь имеет возможность поменять своё имя, то как ты без сохранения это сделаешь?
Никак. Но я не про это. Я про то, что любой сервис должен начинать работу с того, что достать объект из репозитория, а закончивать тем, что положить его обратно (если он мутировал). Не передавать его друг другу напрямую, только через репозиторий (скорее всего БД). Иначе вся твоя защита не стоит выкушеного яйца. Я так не писал никогда, просто могу представить себе наклдные расходы..

Это 2 отдельных вопроса, не относящиеся к данному топику.
Если хочешь - создай отдельные темы, пусть там идёт обсуждение.

Сейчас меня интересуют мнения касательно моей реализации и, что особенно важно, возможных подводных камней. Выборку из репозитория в данном случае врядли можно считать камнем, так как проверка уникальности юзернейма происходит достаточно редко, не говоря уже о возможности кэширования.
А может вообще кто-то найдёт ошибку у меня или предложит решение поинтересней.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (Invis1ble @ 10.02.2018 - 09:58)
Если хочешь - создай отдельные темы, пусть там идёт обсуждение.
Да не... Я же написал - вопрос риторический. Я примерно знаю, как это все сделать наиболее оптимально. Инжектить репозиторий, а в нем смотреть, что тянуть из хранилища, а что уже есть готовое. Но практически мне оно не надо, так что успокоимся на этом.

Цитата (Invis1ble @ 10.02.2018 - 09:58)
Сейчас меня интересуют мнения касательно моей реализации и, что особенно важно, возможных подводных камней.
Ну так навскидку, вот это фигня какая то:
        if ('' === $username) {
throw new \InvalidArgumentException();
}

Легко пропустит два и больше пробела, а так же перенос строки, табуляцию и прочую бяку. Поставь trim() хотя бы. И мне кажется, что такие проверки надо делать снаружи.
Опять же если не делать такую проверку, конструктор там вообще не нужен, получается объект ридонли. И тогда можно без рефлексии обойтись. Хотя это не критично наверно, экономия на спичках.

Еще вот, не думал как может навредить, но почва для размышлений. Конструктор у тебя приватный, а клонирование разрешено. Может оно и не страшно, я так, на вс. случай.

И вопросик... Это ты по приколу так пишешь или реально?
UsernameAlreadyRegisteredCheckerInterface

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
Цитата (twin @ 10.02.2018 - 16:21)
Ну так навскидку, вот это фигня какая то

Да это же просто прототип, там даже нет сообщения в исключении. Данная "проверка" демонстрирует наличие минимального поведения у Username. В реальности там будет использоваться нормальная валидация.

Цитата (twin @ 10.02.2018 - 16:21)
И вопросик... Это ты по приколу так пишешь или реально?
UsernameAlreadyRegisteredCheckerInterface

В каком смысле "по приколу"? Тебя длина названия что-ли смущает?

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (Invis1ble @ 10.02.2018 - 12:50)
Тебя длина названия что-ли смущает?
Да.


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Invis1ble
Цитата (twin @ 10.02.2018 - 16:56)
Цитата (Invis1ble @ 10.02.2018 - 12:50)
Тебя длина названия что-ли смущает?
Да.

Ну да, я так пишу. Не такое уж и длинное название, вообще-то smile.gif

------------------------


Не совсем по теме, ибо сильно вдаюсь в детали реализации, но ситуация и архитектура очень похожа на мою.
На стэке древний топик с обсуждением проблемы касательно доменных репозиториев с простым API: https://stackoverflow.com/questions/2015451...queries-in-cqrs

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

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.