Приветствую. Ранее было интересное незаконченное обсуждение про товары и отзывы товаров. В частности чем будет являться отзыв - самостоятельным агрегатом или сущностью внутри товара.
Продублирую, и еще свое накину:
1) Есть товар, у него 2 статуса проверенный/непроверенный в зависимости от того, проверены все отзывы или нет. В логике есть вещи, которые после опираются на этот статус.
2) Есть отзыв, который админ устанавливает проверен или нет.
3) Отзыв могут лайкать/дизалайкать.
Убираем вопросы гонки + sql операций, все делаем через сущности/агрегаты.
Собственно отзыв - это или 1) сущность внутри агрегата товара, или 2) Самостоятельный агрегат
1) Если сущность. Все api находится в агрегате товара. У товара появляются методы "Лайкнуть/Дилайкнуть комментарий", "Установить комментарий проверенным". Все инкапсулировано в товаре, нет проблем с вычислением товар проверен или нет, просто запускается прогон всех комментариев при установке статуса "проверен" у одно из комментов. Не становится ли агрегеат товара слишком жирным? На него уже возлагается api по лайкам/дизлайкам комментария. Плюс прогон всех комментариев - ну такое себе, правда это уже другой вопрос, вопрос оптимизации.
2) Если отзыв - агрегат. У него свое api по лайкам/дизлайкам + установке статуса проверки. Но тут тогда не понятно, как устанавливать статус у товара, так как вычисления будут в сервисном слое и у товара будет метод типа "сделатьПроверенным". Т.е. товар никак не поддерживает свой инвариант.
3) Есть предположение, что нужно заводить какой-то отдельный агрегат "Отзывы товара" который не является маппингом таблиц БД. Который как раз на себя берет всю эту мороку с отзывами и инвариантами и устанавливает статус товара через БД. Т.е. у товара вообще не будет управление этим статусом, но у него будут данные о нем.
Не понятно что будет более правильно в этом кейсе :) Или вообще по другому верно )