Пусть класс MailConfiguration Задавая параметры для отправки почты:Хорошая практика для проверки неизменных ценностей объекты
public class MailConfiguration {
private AddressesPart addressesPart;
private String subject;
private FilesAttachments filesAttachments;
private String bodyPart;
public MailConfiguration(AddressesPart addressesPart, String subject, FilesAttachments filesAttachements,
String bodyPart) {
Validate.notNull(addressesPart, "addressesPart must not be null");
Validate.notNull(subject, "subject must not be null");
Validate.notNull(filesAttachments, "filesAttachments must not be null");
Validate.notNull(bodyPart, "bodyPart must not be null");
this.addressesPart = addressesPart;
this.subject = subject;
this.filesAttachements = filesAttachements;
this.bodyPart = bodyPart;
}
// ... some useful getters ......
}
Итак, я использую два значение объектов: AddressesPart и FilesAttachment.
тезисов два значения объект имеет сходные структуры, так что я только собирается выставить здесь AddressesPart:
public class AddressesPart {
private final String senderAddress;
private final Set recipientToMailAddresses;
private final Set recipientCCMailAdresses;
public AddressesPart(String senderAddress, Set recipientToMailAddresses, Set recipientCCMailAdresses) {
validate(senderAddress, recipientToMailAddresses, recipientCCMailAdresses);
this.senderAddress = senderAddress;
this.recipientToMailAddresses = recipientToMailAddresses;
this.recipientCCMailAdresses = recipientCCMailAdresses;
}
private void validate(String senderAddress, Set recipientToMailAddresses, Set recipientCCMailAdresses) {
AddressValidator addressValidator = new AddressValidator();
addressValidator.validate(senderAddress);
addressValidator.validate(recipientToMailAddresses);
addressValidator.validate(recipientCCMailAdresses);
}
public String getSenderAddress() {
return senderAddress;
}
public Set getRecipientToMailAddresses() {
return recipientToMailAddresses;
}
public Set getRecipientCCMailAdresses() {
return recipientCCMailAdresses;
}
}
И валидаторы: AddressValidator
public class AddressValidator {
private static final String EMAIL_PATTERN
= "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
public void validate(String address) {
validate(Collections.singleton(address));
}
public void validate(Set addresses) {
Validate.notNull(addresses, "List of mail addresses must not be null");
for (Iterator it = addresses.iterator(); it.hasNext();) {
String address = (String) it.next();
Validate.isTrue(address != null && isAddressWellFormed(address), "Invalid Mail address " + address);
}
}
private boolean isAddressWellFormed(String address) {
Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
Matcher matcher = emailPattern.matcher(address);
return matcher.matches();
}
}
Таким образом, у меня есть два вопросы:
1) Если по каким-то причинам позже мы хотим проверить адрес электронной почты (например, чтобы включить/исключить некоторые псевдонимы, соответствующие существующему почтовому списку), следует ли я представить вид IValidator в качестве параметра конструктора? как следующий, а не в результате чего конкретной зависимости (как я сделал):
public AddressValidator(IValidator myValidator) {
this.validator = myValidator;
}
В самом деле, это будет соблюдать принцип D твердого принципа: инъекции зависимостей.
Однако, если мы будем следовать этому логическому, будет ли большинство объектов ценностей иметь абстрактный валидатор, или это просто перехитрить большую часть времени (думая YAGNI?)?
2) Я прочитал в некоторых статьях, чем в отношении DDD, все проверки должны присутствовать и присутствовать только в Aggregate Root, означает в этом случае MailConfiguration.
Я прав, если учесть, что неизменные объекты никогда не должны находиться в состоянии несвязывания? Таким образом, будет ли валидация в конструкторе, как я сделал, предпочтительнее в соответствующем объекте (и, таким образом, избегая того, чтобы агрегат беспокоился о проверке его «детей»?
Спасибо :) Я прочитал вашу статью, и особенно это более подробно: http://hillside.net/plop/plop98/final_submissions/P10.pdf – Mik378
Да, я связан с тем, что я сделал, поскольку это более практичный пример а также связан с исходной статьей по шаблону. – cdeszaq
И в моем случае, когда MailConfiguration обертывает AddressesPart. Имеет ли смысл размещать AddressPartEssence внутри AddressesPart и MailConfigurationEssence внутри MailConfiguration? Или просто в AddressesPart достаточно, чтобы избежать сложного решения? – Mik378