DDD, как обрабатывать объекты-значения без хранилища

Мне нужна помощь с объектом стоимости. Рассмотрим следующий пример.

У меня есть карта лица, которая имеет пан-валюту (USD, EUR, GBP) и тип карты (Visa, Visa Electron, Mastercard). Я думаю, что валюты и типы карт являются ценными объектами, и они хранятся в исходном коде. Согласно значениям DDD объекты не имеют репозиториев.

  1. Вопрос в том, как заполнить выпадающие списки валют и типов карт в интерфейсе при создании новой сущности карты.
  2. Где разместить эти классы на уровне приложений, доменов или инфраструктуры и как извлечь из них данные.

Простой пример был бы бесценным

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 может быть разумным ценным объектом.

Другие вопросы по тегам