Size: a a a

Software Design/Architecture/Zen

2021 July 18

SP

Sergey Protko in Software Design/Architecture/Zen
Я привел пример - твой Project это просто айдишка. Ты можешь ввести конвеншен для мол важных виртуальных/обобщенных концепций (проект в твоём случае) вводим vo для айдишки и это будет нашим клеем
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Так ты и важные концепции в коде будешь иметь и не попадешь в ловушку logical cohesion (все что про проект в сущности проект)
источник

СП

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

СП

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

abstract class AbstractProject {
 private ProjectId $id;
 private ProjectDetails $details;
 
 public function getId(): ProjectId;
 
 public function changeName(string $name): void
 { ... }
 
 public function changeStatus(ProjectStatus $status): void
 { ... }
 
 ...
}

final class XxxxProject extends AbstractProject {
}


так?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Ну он тип "объединяет" разные агрегаты с разным повелением под одну концепцию
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Никаких абстрактных проектов
источник

СП

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

СП

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

SP

Sergey Protko in Software Design/Architecture/Zen
Или общие вещи вынести в свою сушность
источник

СП

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

$myProject->getProjectDetails()->changeStatus() - это ведь не правильно
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Не правильно, думай зачем ты хочешь это делать
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Почему у тебя вообще есть эти референсы и "точно ли тебе нужен статус"
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Вынести в отдельный агрегат и связать по ID ?
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Это получается то, о чём я изначально писал... не понимаю :(
источник

SP

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

СП

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

SP

Sergey Protko in Software Design/Architecture/Zen
Я лишь могу посоветовать:

- избегать наследование. В 99% ситуаций оно не нужно (часто ограничения инфраструктуры единственная отговорка)
- делать агрегаты маленькими - избегать "больших и важных" сущностей вроде проект или юзер - они быстро превращаются в god object
- концепция статуса оч опасная, она "обыденная" и потому мы воспринимаем ее как данность, но обычно нужно это только для ui а на запись всегда можно найти альтернативы. Статусы оч простой способ сделать год обджект
источник

SP

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

СП

Сергей Предводителев... in Software Design/Architecture/Zen
отвяжемся от статуса. Допустим операция  "Изменить дату завершения проекта".
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Ну это работа только с каким нибудь Project Status сущностью,
источник