DDD, как обрабатывать объекты-значения без хранилища
Мне нужна помощь с объектом стоимости. Рассмотрим следующий пример.
У меня есть карта лица, которая имеет пан-валюту (USD, EUR, GBP) и тип карты (Visa, Visa Electron, Mastercard). Я думаю, что валюты и типы карт являются ценными объектами, и они хранятся в исходном коде. Согласно значениям DDD объекты не имеют репозиториев.
- Вопрос в том, как заполнить выпадающие списки валют и типов карт в интерфейсе при создании новой сущности карты.
- Где разместить эти классы на уровне приложений, доменов или инфраструктуры и как извлечь из них данные.
Простой пример был бы бесценным
Update1
Это был мой первый подход, но... я использую валюты в других организациях, таких как MoneyTransfer, там я использую EUR USD GBP и еще несколько, поэтому мне нужно создать еще один enum
public enum MoneyTransferCurrency{
USD, EUR, GBP and a few other
}
Таким образом, я дублирую некоторые валюты, и если мы прекратим обработку платежей в долларах США, мне нужно будет найти все перечисления и удалить валюту в долларах США.
3 ответа
Не пытайтесь усложнять простые вещи.
Если вы априори знаете все возможные значения этих ВО, вы можете иметь их как enum
,
public enum Currency{
USD, EUR, GBP
}
А потом из кода:
Currency.values()
Спросите себя, как часто эти значения меняются? (как часто система использует новый вид валюты?)
Является ли стоимость разработки и поддержки системы (например, таблиц БД) для динамического удаления этих значений без перезапуска приложения меньше, чем с помощью enum и перекомпиляции проекта, когда происходят изменения?
Много раз меня критиковали за это решение с такими аргументами, как "Мне нужно описание значения", например, в представлении, пишущем "Евро", когда у вас есть значение EUR, если у вас есть таблица, у вас может быть столбец описания.
Это может быть легко решено с помощью файла свойств, такого как:
labels.currency.EUR=Euro
labels.currency.USD=Dollars
Проверьте также это:
- Загрузка объекта Value в List или DropdownList, DDD
- Простой сводный вопрос о корне и хранилище
Вы неправильно поняли VO, прочитайте больше информации о них, я думаю, что простой способ понять их - это посмотреть пример Person / Addres.
Что касается вашего случая, просто создайте 3 таблицы, не пытайтесь усложнить простые вещи:
Card (CardID, CurrencyID, CardTypeID)
Currency (CurrencyID, CurrencyName)
CardType (CardTypeID, CardTypeName)
Для DropDowns вы просто запросите таблицы Currency и CardType. И в будущем, если вы добавите новую валюту или CardType, это будет легко сделать.
Currency
а также CardType
не обязательно разумные объекты значения. Объекты значений моделируют концептуальное целое, содержащее связанные атрибуты. Значимые объекты можно сравнивать, сравнивая все их атрибуты.
Подумайте, например, о MonetaryValue
Значение объекта, который состоит из числового значения вместе с валютой:
public class MonetaryValue {
private BigDecimal value;
private Currency currency;
public Amount(BigDecimal value, Currency currency) {
// validations:
assertNotNull(value);
assertNotNull(currency);
this.value = value;
this.currency = currency;
}
[...]
}
Стоимость (например, 100) и валюта (например, евро) вместе описывают ценность вещи. Эта вещь стоит не только "100" и не "евро", а "100 евро".
Сравнение объектов стоимости также важно. Когда речь идет о денежных ценностях, необходимо сравнивать как атрибуты, стоимость, так и валюту. Сравнение стоимости без валюты не сильно помогло бы, так как 100 долларов США - это не то же самое, что 100 евро. Это еще один признак того, что MonetaryValue
может быть разумным ценным объектом.