Size: a a a

2020 October 07

SP

Sergey Protko in symfony
Sergey Protko
так, ДДД говорит спросить у бизнеса что делать.

мол смотри... как убедиться что в базе будет только уникальные ссылки - повесить юник констрейнт. Так? то есть если будет дубль то по пизде пойдет. Дальше вопрос - откуда дубли берутся? с этим ты идешь к бизнесу и выясняешь. Может быть там просто контент менеджер из спредшита руками заполняет (может тогда импорт сделать проще?) может быть еще чего....

Не зная бизнес сторону вопроса ты будешь искать технические решения технических проблем. А ДДД оно не про технические проблемы, оно про buisness domain : )
источник

ПГ

Павел Г. in symfony
Jurij Bachkov
interface ArticleLikeServiceInterface
{
   public function hasLike(Article $article, UserInterface $user): bool;
   public function like(Article $article, UserInterface $user):
void;
   public function unlike(Article $article, UserInterface $user):
void;
}


и всё - задача решена - остальное не важно
Ну это сервис класс, с этим проблем нет, был интересен вопрос создавать ли такой сервис класс или как то пропихнуть в сущность
источник

SP

Sergey Protko in symfony
что-то сложнее "сделать юник констрейт в базе и на UI проверка в стиле валидации уникальности email" имеет смысл думать когда вероятность этого события высока. Высока она когда два чела чет хотят одновременно сделать и их действия между собой конфликтуют.

Если вероятность этого низкая и происходит это редко - зачем загоняться?
источник

SP

Sergey Protko in symfony
не надо оптимизировать систему под QA которым только волю дай они твое приложение будут из двух таб прокликивать
источник

JB

Jurij Bachkov in symfony
Павел Г.
Ну это сервис класс, с этим проблем нет, был интересен вопрос создавать ли такой сервис класс или как то пропихнуть в сущность
Сущность вообще ничего не должна знать о окружающем мире
источник

D

Dmitry in symfony
Sergey Protko
что-то сложнее "сделать юник констрейт в базе и на UI проверка в стиле валидации уникальности email" имеет смысл думать когда вероятность этого события высока. Высока она когда два чела чет хотят одновременно сделать и их действия между собой конфликтуют.

Если вероятность этого низкая и происходит это редко - зачем загоняться?
бобро поржаловать (с) в риск-менеджмент :)
источник

SP

Sergey Protko in symfony
Jurij Bachkov
Сущность вообще ничего не должна знать о окружающем мире
все верно, данные отдельно процедуры отдельно. Это то что называется ООП)
источник

ПГ

Павел Г. in symfony
Jurij Bachkov
Сущность вообще ничего не должна знать о окружающем мире
Ну как сказать, с лайком это проще рушить. Сущность не должна знать про то кто ее лайкнул.  А вот есть сущность "профайл" а у него "видео профайлы(ссылки на ютуб)", которые надо проверить - уже вопрос, должна знать или нет?
источник

JB

Jurij Bachkov in symfony
Нахрена Article об это знать? За 100 лайков название статьи поменяется? Или в тексте смайлик появиться ?
источник

ПГ

Павел Г. in symfony
Просто у меня немного когнетивный диссонанс. Анемик модель плохо, Делаю рич модель - но она наичнает распухать появляется ненужный каплинг, начинаем выносит вот в такие "сервис классы" и в итоге - опять анемик
источник

ПГ

Павел Г. in symfony
Возможно я мешаю всё в кучу
источник

ПГ

Павел Г. in symfony
Jurij Bachkov
Нахрена Article об это знать? За 100 лайков название статьи поменяется? Или в тексте смайлик появиться ?
Согласен, что для жизненнго цикла статьи - ей не нужно знать о комментах, видео и прочем
источник

JB

Jurij Bachkov in symfony
LikeService + кэш + шлюхи
источник

SP

Sergey Protko in symfony
Павел Г.
Просто у меня немного когнетивный диссонанс. Анемик модель плохо, Делаю рич модель - но она наичнает распухать появляется ненужный каплинг, начинаем выносит вот в такие "сервис классы" и в итоге - опять анемик
потому что нельзя просто взять и класть логику в сущности если ты не пересматриваешь модель данных. Если ты взял анемик модель и просто положишь поведение к данным то ты на выходе получишь жирные сущности которые нарушают SRP и OCP.
источник

SP

Sergey Protko in symfony
пересмотр модели данных сложно потому вот живем как @unrealevil
источник

ВУ

Валентин Удальцов... in symfony
Sergey Protko
можно даже сделать так:

namespace App\Likes;

class User
{
   public function __construct(
       private string $userId,
       private Connection $db
  } {}

  public function like(string $postId): void {
      $this->db->executeUpdate('INSERT INTO post_likes VALUES(:postId, :userId) ON CONFLICT DO NOTHING');
  }
}


и потом в контроллере

namespace App\Likes;

class LikesController
{
   public function like(User $user, string $postId) // обратить внимание что это юзер именно для лайков
   {
       $user->like($postId);
   }
}
Класс, мы тоже к этому пришли. Если нет if-а, модель скорее всего не нужна, можно просто обернуть бд в два счёта, чтоб покрасивее было, написать элементарный тест и таска закрыта.
источник

SP

Sergey Protko in symfony
Валентин Удальцов
Класс, мы тоже к этому пришли. Если нет if-а, модель скорее всего не нужна, можно просто обернуть бд в два счёта, чтоб покрасивее было, написать элементарный тест и таска закрыта.
все так. могу добавить что многие хотят просто "один стиль в проекте". мол если у тебя лайки через тэйбл гейтвей то все должно быть так "ВО ИМЯ КОНСИСТЕНТНОСТИ!" . А то что в одном продукте задачи есть и сложные (их мало) и простые (их много) и бывают еще средние...
источник

SP

Sergey Protko in symfony
а один стиль все хотят что бы алгоритм принятия решений был максимально тупым. "если тебе надо сделать фичу делай так" без всяких ифов
источник

AA

Artem Aleksandrov in symfony
Sergey Protko
все так. могу добавить что многие хотят просто "один стиль в проекте". мол если у тебя лайки через тэйбл гейтвей то все должно быть так "ВО ИМЯ КОНСИСТЕНТНОСТИ!" . А то что в одном продукте задачи есть и сложные (их мало) и простые (их много) и бывают еще средние...
Особенно больно, когда людей клинит на фразе “а давайте без ОРМ”
источник

VM

Volodymyr Melko in symfony
гайз, а ни у кого не возникало проблем с тайпед пропертис и сериалайзером?

у меня есть 2 сервиса, первый кидает запрос на второй и с результат запроса конвертится в объект с тайпед пропертис. но при попытке обратится к этим свойствам вылетает ошибка, мол свойства не инициализированы. Хотя по логах я вижу, что запрос ушел и вернул корректные данные. Да и без указания типа все работает, данные в объект попадают
пхп 7.4.10 если что
источник