AV
У одного товара дополнение может быть с ограничением от 0 до 1, у другого - оно может быть с ограничением от 5 до 10, у третьего его может не быть вовсе.
Для примера у товара "телефон" - дополнение "симкарта" от 5 до 10, а у товара "планшет" от 0 до 1. У товара "ноутбук" его вовсе нет. Как пример дополнений: зарядные устройства, защитные стекла и тд.
Допустим, в заказе 2 позиции и каждая со своим дополнением. Первая - планшет Ipad Pro с дополнением "коробка от Ipad Pro". Вторая - телефон Galaxy J2 с дополнениями: "зарядное устройство Samsung" и "симкарта Tele2" в количестве 3 штук.
У меня есть сущности:
Item (id, name, availableItemAdditions) : Планшет, Ноутбук, Телефон
Addition (id, name) : Симкарта, коробка, стекло
ItemAddition (addition_id, max_amount, min_amount) : для телефона (симкарта 1-5, коробка 0-1, стекло 0-1), для планшета (симкарта 0-3, коробка 0-1), для ноутбука (коробка 0-1)
А теперь вопросы:
1) У меня сейчас товар сам знает о доступных ему дополнениях "ItemAddition". И при конструировании агрегата выбранного товара в заказе я на вход получаю Item и выбранные дополнения. Через Item я соответственно "валидирую" дополнение на минимально и максимальное количество. Если дополнения нет в доступных - я выбрасываю исключение.
2) Должен ли товар вообще знать о доступных к нему дополнениях. Или мне лучше создать условный конструктор, который на вход будет принимать товар, доступные ему дополнения и выбранные дополнения. Тогда вопрос как тут проверить то, что эти дополнения принадлежат именно этому товару? Допустим ситуация, где на вход ему поступит (из примера выше) телефон №21 и доступные дополнения от телефона №22. Либо он сам должен внутри себя получать на вход выбранный товар и выбранные дополнениях. А внутри из условного репозитория получать по выбранному товару - доступные дополнения и уже по ним валидировать. Тогда как сам агрегат будет защищаться от инвариантов, если этим будет заниматься "Builder"?