Я хотів би написати заявку на кшталт електронної комерції.
І ви знаєте, що в подібних програмах продукти можуть мати різні властивості та особливості. Для імітації такої можливості я створив такі об'єкти доменної моделі:
Категорія - це щось на кшталт "електроніка> комп'ютери", тобто види продукції. Категорії містять перелік властивостей (Список <Властивість>).
Властивість - незалежна сутність, яка містить назву, одиниці виміру, тип даних. Наприклад, "ім'я", "вага", "розмір екрана". Одна і та ж властивість може мати різні продукти.
Продукт - просто містить ім'я та список значень, що стосуються властивостей. Значення - це об'єкт, що містить просто поле значення та ідентифікатор поля властивості.
Спочатку я вирішив у цій схемі зробити Категорію як єдиний агрегат, тому що, наприклад, коли я додаю новий продукт, мені потрібно знати всі дані, пов'язані з поточною категорією, включаючи властивості, пов'язані з поточною категорією ( category.AddNewProduct (product) ). Але що робити, коли мені просто потрібно додати нову властивість, яка не належить до жодної категорії. Наприклад, я не можу зробити цю категорію.AddNewProperty (властивість), оскільки це чітко говорить про те, що ми додаємо властивість до певної категорії.
На наступному кроці я вирішив розділити Властивість на окремий сукупність, але тоді це буде список з простими сутностями.
Звичайно, я можу створити щось на зразок PropertyAggregate, щоб зберігати всередині списку властивостей та правил господарювання, але коли я додаю товар, мені потрібно мати всередині цього списку весь список властивостей цієї категорії, щоб перевірити інваріанти. Але я також усвідомлюю, що зберігати ланки всередині сукупності на інших агрегатах - це погана практика.
Які варіанти оформлення цього ділового випадку?