DDD: статус - объект значения или сущность?

У меня есть статус

 public final class Status {

        private int code;

        public Status(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

Кажется, что статус может быть объектом значения, потому что два статуса с одним и тем же кодом являются одинаковыми статусами, но статус может быть добавлен администраторами, список статусов должен отображаться в пользовательском интерфейсе;

Чтобы предоставить список статусов с их именами в пользовательском интерфейсе, у меня есть дополнительный класс-оболочка

public final class AvailableStatuses {
    private Status status;
    private String name;

    ...
}

public AvailableStatusesRepository {
    ...
}

Что вы думаете об этом дизайне? Должен ли я настроить его и сделать Статус как сущность и поместить в него поле имени?


person Teimuraz    schedule 11.12.2016    source источник
comment
Я не понимаю ваш Currency класс. Пример: Что такое валюта 124? Или это коды значений кодов ISO, где 124 - канадский доллар (CAD)? Если да, то зачем нужны отдельные Currency и AvailableCurrency? Почему бы просто не иметь объект Currency с внутренним идентификатором, номером ISO, кодом ISO и описанием, поддерживаемый через пользовательский интерфейс?   -  person Andreas    schedule 11.12.2016
comment
code - это внутреннее представление валют, 1 - USD, 2-EUR и т. д. для этого я использую оболочку AvailableCurrency.   -  person Teimuraz    schedule 11.12.2016
comment
@Andreas, я немного изменил вопрос, вместо валюты я изменил концепцию на статус, я думаю, это более четко отразит мое замешательство.   -  person Teimuraz    schedule 11.12.2016


Ответы (3)


Простой ответ с вашим текущим дизайном будет заключаться в том, что AvailableStatus - это сущность, а Status - это объект-значение (VO), который в основном является оболочкой для идентификатора AvailableStatus (его кода).

Ваша модель, вероятно, и так хороша, но вы должны понимать, что вы были вынуждены придумать разные имена, одно для описания сущности, а другое для описания ВО.

Это потому, что вам, возможно, не хватает правильных ограниченных контекстов (BC). У вас может быть BC обслуживания / администрирования / настроек, где Status будет сущностью, в то время как VO будет в любом нижестоящем контексте.

person plalx    schedule 14.12.2016

Это должен быть объект значения, потому что он используется как дескриптор для элементов в вашей модели. Они определяются своими атрибутами, а их атрибуты (т. Е. Статус) определяют их идентичность.

person alltej    schedule 12.12.2016
comment
Спасибо за ответ. Так все в порядке, я завернул объект Status в AvaliableStatus и использую репозиторий, как в моем примере? (Мне нужно предоставить список статусов в пользовательском интерфейсе, разрешить администратору управлять списком статусов и т. Д.). - person Teimuraz; 12.12.2016
comment
может ли ваш конструктор статуса принимать целочисленный код и имя строки? - person alltej; 12.12.2016
comment
это просто предложение сделать ваш код состояния и назвать свойство только для чтения, которое устанавливается в конструкторе. - person alltej; 12.12.2016
comment
в этом случае два статуса равны, если оба идентификатора и имена равны. Итак, code = 1, Name = Active и code = 1, Name = Inactive - рассматривать их как два разных статуса? - person Teimuraz; 12.12.2016
comment
более того, что, если я решу исправить имя статуса, скажем, с «Активный» на «Активирован», или если я впервые допустил синтаксическую ошибку в имени статуса «Актив». Тогда, если Status - Value Object, это означает, что Status (code = 1, name = Activ) не равно Status (code = 1, name = Active) .. - person Teimuraz; 13.12.2016
comment
Объекты-значения неизменны. Он описывает состояние объекта. Скажем, BankAccount, вам обязательно нужно будет найти BankAccount по его идентификатору. Но вы бы не стали искать его статус по идентификатору. Статус не имеет значения изолированно. - person alltej; 13.12.2016

Статус - это объект значения, и он должен включать имя, а не только идентификатор. Оба поля неизменяемы в контексте использования (т. Е. Ни один элемент, имеющий поле статуса, не может изменить объект статуса). Класс-оболочка не нужен.

В контексте вашего приложения администратора статус может рассматриваться как сущность с оговоркой, что однажды назначенный идентификатор не может быть изменен (что не является необычным требованием для сущности с синтетическим ключом идентификатора)

person Steven A. Lowe    schedule 18.01.2017