Ответы пользователя по тегу Предметно-ориентированное проектирование
  • Всегда ли объект должен валидным?

    myrkoxx
    @myrkoxx
    developer
    Моя позиция по даному вопросу - да, всегда объект должен оставаться валидным если разговор идет о 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. И так, по сути, он всегда будет валидным, так как не валидный объект не сможет создатся
    Ответ написан
    Комментировать