Size: a a a

Software Design/Architecture/Zen

2021 April 25

SP

Sergey Protko in Software Design/Architecture/Zen
$approvedReview = $review->approve();
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Так нужно статус товара установить после апрува отзыва. Точнее проверить что все отзывы тоже апрувнуты
источник

SP

Sergey Protko in Software Design/Architecture/Zen
просто нет такого поля как "статус". У тебя статус будет просто

case
  when exists select 1 FROM approved_reviews WHERE id=? then 'approved'
  when exists select 1 FROM pending_reviews WHERE id=? then 'pending'
end
источник

SP

Sergey Protko in Software Design/Architecture/Zen
это штука для UI а не какая-то характеристика продукта
источник

SP

Sergey Protko in Software Design/Architecture/Zen
ты можешь ее даже вычислять на каждый запрос если оч хочется, можно кэшить во вью модельке
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Почему, я в начале писал, что от этого зависят бизнес процессы.
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Т.е. это не просто для UI
источник

SP

Sergey Protko in Software Design/Architecture/Zen
я выше привел - у тебя просто для какой-то операции не будет агрегата соответственно все инварианты процессов будут соблюдены без необходимости вводить какое-то поле
источник

SP

Sergey Protko in Software Design/Architecture/Zen
ну то есть именно на инварианты стэйта системы это не влияет - как следствие это влияет на UX/UI. То есть на то что юзеры делают дальше. А это значит что поле "статус" можно вычислять по наличию/отсутствию каких-то агрегатов и т.д.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
"статус" это оч опасная концепция которая часто создает жирные god objects. У меня вот есть кейс где у сущности за 5 лет с простого "pending in progress done" граф перехода статусов разросся до 12-ти возможных статусов, пиздец сложной логики и все это по сути нужно только что б на UI нужные кнопки показывать
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Хорошее решение было бы 12 агрегатов?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
в моем случае это было бы агрегатов 5
источник

SP

Sergey Protko in Software Design/Architecture/Zen
это бы закрыло разные комбинации
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Как я понял в примере, теже отзывы - это 2 разные сущности с разными таблицами
источник

SP

Sergey Protko in Software Design/Architecture/Zen
и да - в этом проблема с проектирониваем агрегатов через сущности а не через процессы
источник

SP

Sergey Protko in Software Design/Architecture/Zen
вот у тебя есть некий процесс. там есть какие-то activities. Вот обычно инварианты - они где-то там, переходы между активитис, какие-то изменения стэйта. И вот туда надо смотреть в их поиске
источник

SP

Sergey Protko in Software Design/Architecture/Zen
сущности тут вторичны и будут лишь мешать.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
p.s. опять же если процесс у тебя простой или там в процессе учавствует всегда один человек (какой-нибудь личный профиль) когда вероятность конфликта операций маленькая - тогда пофигу и лучше делать проще
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
Если можно ещё последний вопрос напоследок. Должен ли всё-таки товар знать об этих связях? Либо при создании агрегата их доставать из репозитория.
И как в случае создания агрегата через билдер гарантировать отсутсвие инвариантов у самого агрегата?
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Интересный подход, но совсем другой в плане архитектуры, надо осмыслить :)
А не добавляет ли это проблем при переходе одного агрегата в другой? Ведь ранее нужно было поддерживаться один update например. Ну и транзакция - это работа с одним агрегатом и его сущностями.
Тут же выходит что для поддержания целостности нужно 1 агрегат создать, другой удалить и при этом в одну транзакцию все это запихать. Или нет?
источник