Size: a a a

Software Design/Architecture/Zen

2021 July 20

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Абстрактный пример.

Есть проект, у него есть статусы "Новый" и "В работе". Отличие в том, что в новом можно менять название, а в работе уже нет. Я хочу под каждый статус сделать свой агрегат.

class NewProject  {
 function getId(): int;
 function getName(): string;
 changeName(string $name): void;
}

class WorkProject {
 function getId(): int;
 function getName(): string;
}
источник

HH

Human Human in Software Design/Architecture/Zen
Да, вполне
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
А каким образом в таком случае происходит перевод из одного статуса в другой?
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
в NewProject иметь поле "статус" и метод, который будет его изменять?
источник

HH

Human Human in Software Design/Architecture/Zen
Зачем? Ты же как раз хотел избавиться от статуса?
Как вариант - в NewProject сделать конструктор для WorkProject
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Но если я создам конструктор для WorkProject, то я не смогу его сохранить через ORM, ведь это для неё будет новый агрегат и она попытается его вставить в БД, а надо обновлять.
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Или ORM такие вещи разруливает обычно?
источник

HH

Human Human in Software Design/Architecture/Zen
А ты хочешь, чтобы была одна запись в бд на оба типа?
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
да, это же один и тот же проект
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
но даже если разные таблицы делать, то тогда надо первый агрегат удалять при создании второго....
источник

HH

Human Human in Software Design/Architecture/Zen
Вспомнил задачку fes0r-а, там как раз статусы https://t.me/oop_ru/136359
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
сейчас почитаю, спасибо)
источник

HH

Human Human in Software Design/Architecture/Zen
Ну типа считается, что удаление это не про бизнес моделирование, это уже про внутряк.
Можно поставить true/false поле active например.
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
меня смущает хранение в разных таблицах, читать потом не удобно
источник

HH

Human Human in Software Design/Architecture/Zen
Можно настроить маппинг, чтобы хранилось в одной
источник

RL

Romka Los in Software Design/Architecture/Zen
Или паттерн состояние, или ОРМКой через дискриминатор. И скорей всего интерфейс придётся обобщить.
источник

HH

Human Human in Software Design/Architecture/Zen
Или вынести условное ProjectInfo в отдельную таблицу,
И заюзать композицию
источник

HH

Human Human in Software Design/Architecture/Zen
Я за второй вариант, ибо зачем тебе лишние связи
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
непонятно как скрестить паттерн состояние и агрегат. Ведь мы можем внутренние объекты агрегатов менять только через методы агрегатов, а их нет, так как они все внутри классов состояний
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
эх, посмотреть бы примерчик)
источник