Моя позиция по даному вопросу - да, всегда объект должен оставаться валидным если разговор идет о entity или value object.
Рассмотрим случай когда пользователь вводит в форму номер документа и View передает этот номер Presenter'у. Если номер оказался неверного формата или не является уникальным, то может ли Presenter присвоить значение свойству RegNumber объекта Document?
Я б сделал так (не факт что правильно, нужно лучше понимать вашу предметную область, просто исходя из описаного):
На View и с View передавал бы Presentation . Он может быть как раз не валидным. По сути он тупая DTO'шка, всего лиш ресурс. Отдавать напрямую entity не очень хорогая идея. Простой пример - REST. В REST ключевая единица ето ресурс. Ресурс по сути ето проеция или мапинг entity или нескольких entities:
A resource is a conceptual mapping to a set of entities, not the entity that corresponds to the mapping at any particular point in time. Architectural Styles and the Design of Network-bas...
RegNumber - я б делал ValueObject с валидацией внутри (прям в конструкторе ), вот псевдо-код:
class RegNumber
{
private regNumber;
private construct(regNumber)
{
this.setRegNumber(regNumber);
}
private setRegNumber(regNumber)
{
this.assertRegNumberIsValid(
regNumber
);
this.regNumber = regNumber;
}
public static function create(regNumber)
{
return new self(regNumber);
}
private function assertRegNumberIsValid(regNumber)
{
if (regNumber is bad) {
throw new InvalidRegNumber()
}
}
}
и уже его испольовал в Document. И так, по сути, он всегда будет валидным, так как не валидный объект не сможет создатся