как Разбивать базу проекта на Domain и Application Logic

fixxxer

К.О.
Партнер клуба
Да ну ладно, что это за AR тогда будет.
Нормальный ActiveRecord будет. Это в yii ненормальный. :)

ActiveRecord - это entity + mapper в одном классе, ничего более. ActiveRecord не означает анемичность модели. Другое дело, что провоцирует на это.

Можно, например, взять тот же Analogue ORM и легким движением руки сделать из него ActiveRecord (маппинг "на лету" сгенерировать чуть сложнее, но это не суть, это опустим):

PHP:
abstract class ActiveRecord {

      public static function find($id) {
           return ORM\Manager::getInstance()->mapper(get_called_class())->findOrFail($id);
      }

      public function save() {
           ORM\Manager::getInstance()->mapper(get_called_class())->store($this);
      }

      public function delete() {
           ORM\Manager::getInstance()->mapper(get_called_class())->delete($this);
      }

}
Другое дело, что тут возникает вопрос - а нафига вообще этот ActiveRecord, если от него никакой пользы, окромя вреда. Это правильный вопрос. :)
 
Последнее редактирование:

Adelf

Administrator
Команда форума
Я нарисовал с помощью Monodraw.
У меня на мобилке кстати все расплылось. На компе норм.

@fixxxer, в идеале да, все так как ты описал. Но все реализации AR с которыми доводилось работать лезут в базу при каждом чихе. Lazy-loading -тут понятно. Но и добавить новую сущность в коллекцию manyToMany или hasMany - нормально не получится. Сразу летит insert в базу. Хотя в идеале оно должно в save() весь DML делать. Так что тестить AR модели - то еще зло. Приходится извращаться, и да => Anemic :)

@ivanov77, Вурдалак все правильно изложил. Я тоже хотел, но у меня вышло бы длиннее, от того и поленился :) Разве что, я не очень понимаю почему Domain обращается к Infrastructure. Зачем? @Вурдалак ?
Upd: А. Не обращается, а наоборот, видимо. Инфраструктура достает обьекты из базы например. Ясно.
 

Вурдалак

Продвинутый новичок
Разве что, я не очень понимаю почему Domain обращается к Infrastructure. Зачем? @Вурдалак ?
Upd: А. Не обращается, а наоборот, видимо. Инфраструктура достает обьекты из базы например. Ясно.
Да не, тут особого смысла нет, просто хотел указать, что есть инфраструктура, и что она «сбоку».
 

Yoskaldyr

"Спамер"
Партнер клуба
кстати на хабе прикольная статейка сейчас обсуждается
Не только мусор но и вредная. У чела все в голове смешалось и не разобравшись со всеми терминами и паттернами решил излить свой поток сознания.
 

WMix

герр M:)ller
Партнер клуба
Ну, так се, вредная, ее заплюсили.. я в код сильно не вдумывался, но парень ловко обосновывает аргументы. Чтоб там небыло, есть интересные моменты
 

Adelf

Administrator
Команда форума
А я недавно видео доклада смотрел. Там человек очень много говорит правильных слов, даже в bullshit bingo можно играть. Идеальная архитектура, True ООП, Single responsibility. Но предлагает такое... что даже стыдно говорить. Да еще и книгу об этом написал. Я не рекомендую это видео смотреть. Но я специально нашел момент со слайдом главного объекта бизнес-логики. Прям любо-дорого глянуть :)

https://youtu.be/ckjAWXJWZEY?t=1526
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
А я недавно видео доклада смотрел. Там человек очень много говорит правильных слов, даже в bullshit bingo можно играть. Идеальная архитектура, True ООП, Single responsibility. Но предлагает такое... что даже стыдно говорить. Да еще и книгу об этом написал. Я не рекомендую это видео смотреть. Но я специально нашел момент со слайдом главного объекта бизнес-логики. Прям любо-дорого глянуть :)

http://bit.ly/2xwD8Ny
Так статья этого пациента уже тут на форуме проскальзывала: http://www.yegor256.com/2014/12/01/orm-offensive-anti-pattern.html
Адская некомпетентность. Но видимо своим видом он внушает доверие у неподготовленных слушателей/читалей.
Что ж, гомеопаты среди программистов тоже есть и по всей видимости у него есть своя целевая аудитория.

Правда там в комментах написано, что его «негативно восприняли», поэтому с удовольствием посмотрю ответы на вопросы как-нибудь :)
 

fixxxer

К.О.
Партнер клуба
А я недавно видео доклада смотрел. Там человек очень много говорит правильных слов, даже в bullshit bingo можно играть. Идеальная архитектура, True ООП, Single responsibility. Но предлагает такое... что даже стыдно говорить. Да еще и книгу об этом написал. Я не рекомендую это видео смотреть. Но я специально нашел момент со слайдом главного объекта бизнес-логики. Прям любо-дорого глянуть :)

https://youtu.be/ckjAWXJWZEY?t=1526
Во всяком адском хайлоаде типа соцсетей похожий "ручной активрекорд" с тюнингованными под конкретные кейсы запросами часто делается. Вот только там все понимают, что это вынужденная мера, а не верх дизайна, ну и это делается в тех местах, где бизнес-логики практически и нет, сплошная инфраструктура да view.
 

fixxxer

К.О.
Партнер клуба
А, точно. Тогда непонятно, нафига вообще тогда этот класс-то с единственным this.id, можно и статикой все сделать с таким же успехом.
 

Вурдалак

Продвинутый новичок
Он сделал сеттер TransactionScript::setId(). И назвал это «sql speaking object». И написал книгу, выступает на конференциях. Своего рода Евгений Попов в мире архитектуры.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Я эту проблему, помнится, решал безо всяких GraphQL небольшой модификацией батчей в jsonrpc2, добавив туда возможности ссылаться в параметрах на результаты другого элемента батча (по ID) и псевдокоманды типа Batch.match/Batch.repeat/Batch.filter.

Конечно, сломал этим независимость элементов батча друг от друга и возможность распараллеливания, но как раз это мне и не надо было совсем.
Помню, 5 лет назад я сделал это добавлением служебного запроса в batch, назвал его meta. Там передавал структуру зависимостей - результат первого в параметры второго, а сами вызовы сохраняются независимыми.

REST действительно ассоциируется с CRUD, мы это уже обсуждали
написал большой пост в той ветке :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Чистый юнит тест для реалий Yii будет непросто сделать
да что вы говорите! а разделять методы получения и модификации данных не пробовал? моки, фикстуры - не? интеграционные тесты не подходят?
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
4. Service layer должен быть максимально stateless: никаких Yii::$user, сессий, и прочего «текущего состояния». Если ты захочешь, например, в админке или в консольной команде от имени пользователя отправить сообщение, то должно быть достаточно указать userId. Как ты понимаешь, Yii::$user где-то внутри бизнес-логики будет этому сильно мешать, т.к. его либо не будет, либо он может указывать на другого пользователя (на админа, например).
Добавлю, что значение Yii::$app->user->id надо из контроллера передавать в SL как параметр метода. Тогда в SL не будет зависимости от класса User
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Я не знаю про устройство Yii AR, но если там нельзя даже сделать new User() без обращения к БД, то просто выкинь это говно. Но я подозреваю, что не все так плохо.

А вообще AR вполне можно тестировать, никто же не заставляет вызывать методы типа save(), нам же методы модели надо протестировать, а не методы AR.
я много лет не писал на yii, но мне понадобилось 3 клика мышкой и 3 скролла по странице чтобы открыть http://www.yiiframework.com/doc-2.0/yii-test-baseactivefixture.html
 
Сверху