2016-11-10 8 views
1

Во многих обучающих программах java об DDD объекты являются изменяемыми объектами.DDD в Scala: Должны ли сущности быть неизменными?

class Product { 

    private String status; 

    public void prepare() { 
     this.status = "Prepearing"; 
    } 
} 

В приведенном выше примере, готовят метод мутирует внутреннее состояние объекта.

Но в Скале, я бы хотел, чтобы мои объекты неизменяемым:

case class Product(status: String) { 
    def prepare: Product = { 
     this.copy(status = "Prepearing"); 
    } 
} 

Так вместо того, чтобы мутировать объект, я возвращаюсь назад новый объект.

В порядке ли DDD иметь неизменяемые сущности и выше реализации?

Или вы можете рекомендовать лучший подход?

+0

Этот вопрос, вероятно, будет лучше подходит для http://softwareengineering.stackexchange.com – Jubobs

ответ

1

В DDD сущности, естественно, демонстрируют различные стадии или состояния жизненного цикла. В приведенном выше примере статус продукта может быть «Подготовка», «Выполнение», «Отгрузка», «Выход из-за поставки» и т. Д. Из-за этого жизненного цикла иногда возникает соблазн моделировать объекты, использующие шаблон состояния. Некоторые практикующие DDD сильно препятствуют либеральному использованию государственного образца для юридических лиц. Причина в том, что это может привести к побочным эффектам метода сущности. Побочные эффекты могут сделать код более сложным для тестирования, и они часто могут быть источником ошибок. Класс Product выше должен иметь возможность явно указать, в каком состоянии он должен работать. Он не может отправить то, что еще не подготовлено и выполнено.

+0

Так это второе пример правильный? – Teimuraz

+0

Да. Что-то, что вы, возможно, захотите взглянуть, это шаблон памяти - http://www.dofactory.com/net/memento-design-pattern – alltej

1

Должны ли сущности быть неизменными?

Да, возможно, должно быть. Если я держу ссылку на ваш объект, и вы меняете его, я должен увидеть эти изменения. Это в значительной степени причина, по которой мы используем сущность, а не значение.

Отзыв Владимир Хориков на entities vs values; Jimmy Bogard; Martin Fowler ....

Или вы можете порекомендовать лучший подход?

Создайте отдельную концепцию для состояние объекта. Пусть это состояние является объектом ценности.

class Product { 

    private State state; 

    public void prepare() { 
     this.state = this.state.updateStatus("Preparing"); 
    } 
} 

разговор Стюарта Halloways' на Clojure time model помогает объяснить, что здесь происходит; слайд 31 в его deck включает в себя хорошую визуализацию Identity как последовательность состояний.

В качестве альтернативы, вы можете отказаться от ОО подхода в целом, и выразить изменения как чистые функции

newState = theModel.prepare(oldState); 

 Смежные вопросы

  • Нет связанных вопросов^_^