2011-01-28 2 views
2

При просмотре проекта Evans на образце проекта DDD я замечаю, что в объекте Cargo Evans использует номер дорожки, который является объектом значения. Почему он не выбрал простой string tracknumber вместо этого выбирает объект ценности для идентификации? Вот отрывок из Эванс:Использование объекта value в качестве идентификатора в объекте

public class Cargo implements Entity<Cargo> { 

    private TrackingId trackingId 
} 

public final class TrackingId implements ValueObject<TrackingId> { 

    private String id; 

    /** 
    * Constructor. 
    * 
    * @param id Id string. 
    */ 
    public TrackingId(final String id) { 
    Validate.notNull(id); 
    this.id = id; 
    } 

ответ

2

Несколько вещей, которые бы достичь:

  • инкапсулирует логику, что Tracking ID не должен быть нулевым
  • инкапсулирует логику, что Tracking ID не должен изменение один раз установлен.

С помощью простой строки объект Cargo должен знать об этих правилах. Использование подхода Value Object означает, что TrackingId поддерживает эти правила о себе.

+0

Мы можем добиться того же самого в мире .Net, у нас есть переменная readonly, которая устанавливается только через конструктор и не может быть изменена позже или только без getter no setter. – kamal

+0

Конечно, но тогда логика будет находиться в объекте Cargo, а не в TrackingId. Точка, которую я делал, - это подход Value Object, который инкапсулирует эту логику в идентификатор отслеживания. – David

+0

@kamal. TrackingId также сможет выполнять другие полезные вещи, которые объект Cargo не нужен или не хочет знать, например, форматирование по запросу клиента, присвоение следующего доступного идентификационного номера и другая сложная логика, которая более чем оправдывает ее существование , ура – Berryl