Size: a a a

Software Design/Architecture/Zen

2021 May 04

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Нет. Разный только синтаксис. А ООП – это общее понятие для всех языков.
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
Добрый день.
Нигде особо не могу найти информацию по поводу аггрегатов, сущностей, vo и как они должны маппится на бд.
Как я для себя на данный момент уяснил - vo не имеет собственных таблиц, сущность имеет свою таблицу. Аггрегат всем оркестрирует и просто представляет собой срез данных с помощью сущностей и vo, т.е.
Внутри сущности и vo не должно быть ничего лишнего - они должны маппится полностью (т.е. каждое поле = столбец).
На счет аггрегатов хотелось бы узнать, могут ли внутри них быть "ненужные данные". Допустим может ли в агрегате содержаться информация, которая НЕ маппится и используется только для внутренних штук. Ну и в принципе правильно ли я это все понимаю?
Спасибо
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Этот ваш изначальный консерн привит вам именно кривыми фреймворками и ORM, которые не умеют работать с настоящими объектами, а умеют только в POJO без конструкторов, с сеттерами и геттерами. Потому это и не в тренде.
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Если лишняя информация никуда не смапится, то логично, что после доставания обратно сущности с VO из БД она туда ниоткуда не вернется.

А если имеете в виду какие-то настройки, то просто передавайте их прямо дополнительным параметром в тот метод, которому оно нужно.
источник

SM

Sergey Milimko in Software Design/Architecture/Zen
Неправильно, как угодно могут мапится.
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
class Championship
{
   private array $teams;

   public function addTeam(int $teamId, array $players)
   {
       // как сюда передать игроков, если им нужна команда, которой еще не существует???
       $this->teams[] = new Team($teamId, $players, $this);
   }
}

class Team
{
   private int $id;
   private array $players;
   private Championship $championship;

   public function __construct(int $id, array $players, Championship $championship)
   {
       $this->id = $id;
       $this->players = $players;
       $this->championship = $championship;

       if (count($players) !== 11) {
           // кидаем исключение, что игроков неверное количество
       }
   }

   public function addPlayer($playerId)
   {
       $this->players[] = new Player($playerId, $this);
   }
}

class Player
{
   private $id;
   private Team $team;

   public function __construct($id, Team $team)
   {
       $this->id = $id;
       $this->team = $team;
   }
}
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
Как в таком коде добавить команду в чемпионат? Там я в коде пометил проблемные места с нужными вопросами - комментариями
источник

SM

Sergey Milimko in Software Design/Architecture/Zen
Снчала создать команду потом добавить её в чемпионат. Добавить через указание её идентификатора. Читай про агрегаты и их границы короче
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
На счет этого я думал. Получается что временно мы создаем команду без чемпионата.
источник

SM

Sergey Milimko in Software Design/Architecture/Zen
Да, в физическом мире команды прекрасно существуют без чемпионатов
источник

SM

Sergey Milimko in Software Design/Architecture/Zen
и игроки без команд
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
Это я понимаю. Но вопрос в том, что в "нашем мире" игроки не могут существовать без команд
источник

SM

Sergey Milimko in Software Design/Architecture/Zen
Даже долю секунды?
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
допустим да
источник

IM

Igor Molochnikov in Software Design/Architecture/Zen
И команда может участвовать в чемпионате и не в одном. Вроде как получается что чемпионат и команда это отдельные агрегаты. При этом чемпионат должен содержать коллекцию ид команд. Может так как-то?
источник

IM

Igor Molochnikov in Software Design/Architecture/Zen
Ну и там по итогам матча вылет или очки хз
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
Я вот тоже так думал. Но до сих пор не понимаю того, что "объект должен протектить свой стейт". Но в любом подходе - получается что протектить объект свой стэйт не может
источник

AV

Alexey Vetrov in Software Design/Architecture/Zen
т.е. даже это правило
if (count($players) !== 11) {
  // кидаем исключение, что игроков неверное количество
}
источник

IM

Igor Molochnikov in Software Design/Architecture/Zen
Таким образом инвариант соблюдён, в команде 11 игроков. Вроде норм же?
источник

RL

Romka Los in Software Design/Architecture/Zen
Разделяйте еще связь между агрегатами. Чемпионат - это отдельный агрегат. Связь с командами слабая(по идентификатору). Команда - отдельный агрегат, с инвариантом - количество игроков. Есть ли ограничение, что в рамках протекающего чемпионата не может быть трансферов?
источник