2012-02-24 5 views
2

его хорошая практика для передачи объекта значения методам сущности (с точки зрения DDD)? Например, у меня есть метод в моей сущности Клиент:Передать значение объекту методу сущности

SetAddress(Address invoiceAddress); 

это действует? Или я должен передать адресные параметры как

SetAddress(string street, string town, string zip, string country); 

и разрешить клиенту обрабатывать создание адресного объекта и, если это необходимо, сделать исключение.

Адрес является неизменным объектом.

ответ

5

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

Также Address объект должен содержать логику проверки для информации адреса, который метод Customer.SetAddress(...) может выполнить перед установкой адреса:

public class Customer 
{ 
    public SetAddress(Address invoiceAddress) 
    { 
     // ToDo: Execute validation logic encapsulated in 'Address' object 
     // ToDo: Execute additional validation logic here 
    } 
} 
+0

ОК спасибо, я подумал, что это правильно, но я не был уверен – Ivan

+0

Добро пожаловать. –

0

Вы могли бы фабричный метод как часть Адрес

public class Address 
{ 
    public static Create(string street, string zip) 
    { 
     return new Address { Street = street, Zip = zip }; 
    } 
} 

Идея заключается в том, что PARAMS для Create показывают, что являются обязательными свойств для создания объекта адреса.

var address = Address.Create("street", "zip"); 

customer.SetAddress(address); 
+0

в адресе Я определил конструктор с параметрами, поэтому я думаю, что результат от этого один и тот же. мой вопрос: является ли класс клиента ответственным за создание адреса VO или должен ли я просто передать его методу. спасибо за сообщение. – Ivan

+0

Короче говоря, Клиент не несет ответственности за создание Адреса. Только адрес знает, как выглядит действительный адрес. –

1

от объекта ориентированной точки зрения, три аргумента SetAddress() представляет Address следовательно, должен быть инкапсулирован в экземпляр класса Address. Хотя я не уверен, почему у вас есть способ выполнить SetAddress, вы не можете использовать setter?

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

Чтобы избежать таких сценариев, лучше всего, чтобы SetAddress() принял аргумент типа, который четко указан в его имени, например, экземпляр Address.

+0

as i undrestood это может нарушить неизменность адресного объекта. – Ivan

+0

Вы можете создать экземпляр «Адрес» таким образом, чтобы он отображал сеттеры для города, zip и т. Д. И инициализировался только через конструктор. –