Спасибо за видео! Разбирать кейсы за пределами уровня hello world это очень круто, хоть и мало где встречается Видос классный, но хотелось бы увидеть более развёрнутые примеры. Например на алхимии с джоинами и + в добавок если в модели присутствуют файлы. Как и где правильно открыть транзакцию, когда проводить считывание и запись файлов, чтобы при этом тайм-аут в транзакции не отлетел. Вот этого всего побольше пожалуйста.
Есть ощущение что автор путает DAO и Repository. Но даже если и так. Взять ту же джангу. Усложнить запрос, например агрегация какая то. И вот мы переизобретаем ORM. А в алхимии вы где будете джоины писать?
Просто не нужно использовать Repository для отдачи данных на UI. Repository используют для изменения состояния доменных сущностей. То есть нашли доменную сущность, изменили её состояние, положили в базу данных. Таким образом выборка будет только по id. Поскольку в DDD одну сущность от другой отличают именно по id вы не можете искать сущность по каким-либо другим критериям. А вот для отдачи данных на UI нужно просто напрямую ходить в базу минуя Repository и ORM. Бывают конечно ситуации, когда вы допустим хотите посчитать средний чек покупателя и затем сохранить это значение в сущность покупателя. Тогда вроде как хочется найти все заказы покупателя по какому-нибудь customerId, но нет в таких ситуациях нужно использовать Domain Service, внутри которого будет обычный прямой запрос в базу данных, который посчитает и вернет средний чек. А спецификация, это про булеву логику. То есть метод isSatisfied должен возвращать булево значение, а не какой-то иной тип данных. Соответственно его используют, когда нужно взять сущность, которая уже лежит в памяти и проверить удовлетворяет ли она каким-либо бизнес-правилам или нет. Понятно, что любые костыли можно к чему угодно приделать, но всё же, лучше каждый паттерн использовать там где он уместен.
@@PythononPapyrusRU Если не трудно, дайте ссылку. Т.к. единственное что там есть про базу данных, это что-то типа "оптимизируйте сами загрузку обьектов из бд в память"
@@PythononPapyrusRU в «Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура» предлагают отдавать данные на UI в обход репозитория.
Идея про разбор паттернов в работе с бд (да и вообще с кодом, приближенным к реальности) очень хорошая, единственное что показалось, что не до конца разобрал примеры. Имею ввиду не дописал программу как-будто торопился) спасибо за видео, но прошу доделать до конца в плане написания классов и реализации примеров (например не дописал класс с методами __and__ __or__ и переключился на что-то другое)
Обратите внимание, что все подклассы спецификации, который упомятуны в видео должны быть абстрактными. А потом уже реализация для репозитория, который работает с orm. Или же. Если вдруг мы хотим иметь такого вида спецификации, то делать адаптер для движка, который работает с другими системами хранения данных. Вот представьте, что у нас нет orm, есть CSV. Как мы из репозитория уберем логику отбора записей? Даже если напишем движок, как он поймет контрукцию age_gte=18? Блин, сложно все, когда нет sql))
Добрый день, спасибо за видео и объяснение. Возник вопрос по поводу конструкции return {“age__gte”: 18} - это синтаксис django ? Или можно, например, в SQLALCHEMY использовать .? Лучше если скажете, где об этом прочитать . Спасибо большое
Такое можно в sqlalchemy использовать, но скорее вам нужно будет передавать сам запрос в спецификацию, а после добавлять к нему поля. Могу в одном из видео показать
привет недавно столкнулся с такой проблемой то что нужно было сделать под запрос я использовал паттерн Repository и просто внутри добавил метод sub_query() можешь сказать правильно ли я сделал?)
@@PythononPapyrusRU ок понятно а можно ли в repository писать свои сырые запросы не будет ли это нарушение логики или же нужно в спецификацию тоже ложить?
Скорее лучше в спецификации. Можно написать только ту часть запроса в которой нет фильтров WHERE и похожих вещей. Также сами значения из SELECT тоже нельзя
Спасибо за видео! Разбирать кейсы за пределами уровня hello world это очень круто, хоть и мало где встречается
Видос классный, но хотелось бы увидеть более развёрнутые примеры. Например на алхимии с джоинами и + в добавок если в модели присутствуют файлы. Как и где правильно открыть транзакцию, когда проводить считывание и запись файлов, чтобы при этом тайм-аут в транзакции не отлетел. Вот этого всего побольше пожалуйста.
Классное видео, хоть и знал, но, всё равно интересно было смотреть. Рад что разбираются более продвинутые приёмы, полезно. Спасибо большое
Есть ощущение что автор путает DAO и Repository. Но даже если и так. Взять ту же джангу. Усложнить запрос, например агрегация какая то. И вот мы переизобретаем ORM. А в алхимии вы где будете джоины писать?
Просто не нужно использовать Repository для отдачи данных на UI. Repository используют для изменения состояния доменных сущностей. То есть нашли доменную сущность, изменили её состояние, положили в базу данных. Таким образом выборка будет только по id. Поскольку в DDD одну сущность от другой отличают именно по id вы не можете искать сущность по каким-либо другим критериям. А вот для отдачи данных на UI нужно просто напрямую ходить в базу минуя Repository и ORM.
Бывают конечно ситуации, когда вы допустим хотите посчитать средний чек покупателя и затем сохранить это значение в сущность покупателя. Тогда вроде как хочется найти все заказы покупателя по какому-нибудь customerId, но нет в таких ситуациях нужно использовать Domain Service, внутри которого будет обычный прямой запрос в базу данных, который посчитает и вернет средний чек.
А спецификация, это про булеву логику. То есть метод isSatisfied должен возвращать булево значение, а не какой-то иной тип данных. Соответственно его используют, когда нужно взять сущность, которая уже лежит в памяти и проверить удовлетворяет ли она каким-либо бизнес-правилам или нет. Понятно, что любые костыли можно к чему угодно приделать, но всё же, лучше каждый паттерн использовать там где он уместен.
Хорошо, тогда вопрос такой: почему в самой книге по DDD от Эванса паттерн спецификация использовался вместе с репозиторием(и даже SQL)?
@@PythononPapyrusRU Если не трудно, дайте ссылку. Т.к. единственное что там есть про базу данных, это что-то типа "оптимизируйте сами загрузку обьектов из бд в память"
@@PythononPapyrusRU в «Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура» предлагают отдавать данные на UI в обход репозитория.
@@НикитаК-ъ9шбред, а не книга
Идея про разбор паттернов в работе с бд (да и вообще с кодом, приближенным к реальности) очень хорошая, единственное что показалось, что не до конца разобрал примеры. Имею ввиду не дописал программу как-будто торопился) спасибо за видео, но прошу доделать до конца в плане написания классов и реализации примеров (например не дописал класс с методами __and__ __or__ и переключился на что-то другое)
Обратите внимание, что все подклассы спецификации, который упомятуны в видео должны быть абстрактными. А потом уже реализация для репозитория, который работает с orm. Или же. Если вдруг мы хотим иметь такого вида спецификации, то делать адаптер для движка, который работает с другими системами хранения данных. Вот представьте, что у нас нет orm, есть CSV. Как мы из репозитория уберем логику отбора записей? Даже если напишем движок, как он поймет контрукцию age_gte=18? Блин, сложно все, когда нет sql))
Исходя из этого вопрос автору, приходилось ли вам работать с репозиториями, не знающие про orm, и как там это дело реализовать
Добрый день, спасибо за видео и объяснение. Возник вопрос по поводу конструкции return {“age__gte”: 18} - это синтаксис django ? Или можно, например, в SQLALCHEMY использовать .? Лучше если скажете, где об этом прочитать .
Спасибо большое
Такое можно в sqlalchemy использовать, но скорее вам нужно будет передавать сам запрос в спецификацию, а после добавлять к нему поля. Могу в одном из видео показать
@@PythononPapyrusRU буду признателен за ещё один пример в видео на примере sqlalchemy
привет недавно столкнулся с такой проблемой то что нужно было сделать под запрос я использовал паттерн Repository и просто внутри добавил метод sub_query() можешь сказать правильно ли я сделал?)
Нуу, тут нужен контекст. Скорее всего нет, потому что этот подзапрос можно вставить в спецификацию
@@PythononPapyrusRU ок понятно а можно ли в repository писать свои сырые запросы не будет ли это нарушение логики или же нужно в спецификацию тоже ложить?
Скорее лучше в спецификации. Можно написать только ту часть запроса в которой нет фильтров WHERE и похожих вещей. Также сами значения из SELECT тоже нельзя
И так мы медленно изобретеаем mongo запросы...)
разворотка
А помельче нельзя было, а то слишком хорошо видно...
так нормально ведь видно