Size: a a a

Ruby, Rails, Hanami | dry-rb

2020 November 11

DM

Dmitriy Tensei Malys... in Ruby, Rails, Hanami | dry-rb
Sergey Budaev
Привет всем!
Есть такой паттерн Service Object. И вроде бы всё ок за исключением того что все его понимают по своему (судя по коду) из разных проектов:
CreateUser.new.call(params)
CreateUser.new(params).call
CreateUser.call(params)
.run, .execute, что там ещё…
Кто-то возвращает только объект или nil, кто-то заворачивает, кто-то ошибки в errors оборачивает, кто-то бросает исключения. Какая-то вакханалия.
Я решил не городить свой и посмотреть есть ли какой простенький гем который реализует этот патерн и даёт уже набор готовых модулей. Кажется что это должно быть достаточно простой гем, но писать свой я не хочу пока не выяснил что других нет.
Так вот вопрос: как вы реализуете этот патерн у себя в проекте, что используете (свой набор базовых классов или готовое). И есть ли что в dry-rb такого? (dry-rb я не использовал)
если что-то простое надо то проще самому написать обычный класс, как назвать метод дело вкуса, обычно call/execute/run, а так их много разных, например interactor/active_interaction gem'ы
источник

ВВ

Виктор Власов... in Ruby, Rails, Hanami | dry-rb
источник

АП

Александр Поляков... in Ruby, Rails, Hanami | dry-rb
называть call хорошо по тому что можно передать лямду и или прок подменив возвращаемое значение.
на тестах например
источник

AD

Anton Davydov in Ruby, Rails, Hanami | dry-rb
Sergey Budaev
Привет всем!
Есть такой паттерн Service Object. И вроде бы всё ок за исключением того что все его понимают по своему (судя по коду) из разных проектов:
CreateUser.new.call(params)
CreateUser.new(params).call
CreateUser.call(params)
.run, .execute, что там ещё…
Кто-то возвращает только объект или nil, кто-то заворачивает, кто-то ошибки в errors оборачивает, кто-то бросает исключения. Какая-то вакханалия.
Я решил не городить свой и посмотреть есть ли какой простенький гем который реализует этот патерн и даёт уже набор готовых модулей. Кажется что это должно быть достаточно простой гем, но писать свой я не хочу пока не выяснил что других нет.
Так вот вопрос: как вы реализуете этот патерн у себя в проекте, что используете (свой набор базовых классов или готовое). И есть ли что в dry-rb такого? (dry-rb я не использовал)
Тебе не нужен гем для сервисных объектов, это же просто класс и все. В драй есть монады, которые можно рассматривать как результирующий объект и есть ду нотация, которая позволяет сделать рейл вей (не путать с рельсой)
источник

АП

Александр Поляков... in Ruby, Rails, Hanami | dry-rb
Александр Поляков
называть call хорошо по тому что можно передать лямду и или прок подменив возвращаемое значение.
на тестах например
источник

AD

Anton Davydov in Ruby, Rails, Hanami | dry-rb
Ага, все так
источник

I

Ildar in Ruby, Rails, Hanami | dry-rb
Sergey Budaev
Привет всем!
Есть такой паттерн Service Object. И вроде бы всё ок за исключением того что все его понимают по своему (судя по коду) из разных проектов:
CreateUser.new.call(params)
CreateUser.new(params).call
CreateUser.call(params)
.run, .execute, что там ещё…
Кто-то возвращает только объект или nil, кто-то заворачивает, кто-то ошибки в errors оборачивает, кто-то бросает исключения. Какая-то вакханалия.
Я решил не городить свой и посмотреть есть ли какой простенький гем который реализует этот патерн и даёт уже набор готовых модулей. Кажется что это должно быть достаточно простой гем, но писать свой я не хочу пока не выяснил что других нет.
Так вот вопрос: как вы реализуете этот патерн у себя в проекте, что используете (свой набор базовых классов или готовое). И есть ли что в dry-rb такого? (dry-rb я не использовал)
Написал когда-то базовый класс и таскаю его по разнцм проектам. Использую CreateUser.call(params). Этот call в базовом классе который по сути делает CreateUser.new(params).call. Такой метдо использую, потому что рассматриваю сервисный объект функцию, т.е. ты при вызове передаешь параметры и все, больше ничего с ним сделать нельзя и такой подход (с read-only параметрами) сильно облегчает логику реальзации, особоенно в плане кэширования. На выходе обычно просто возвращаю значение, пока не подадобится чего-то большего. А в 95% случаев как-то ничего большего и не надо бывает. Если все-таки надо, то добавляю класс Respond со статусом и payload’ом и методы для его создания.
Гемы не использую потому что весь код это 10-20 строчек. Как-то лень ради этого гем подключать, и добавлять лишние зависимости.
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Sergey Budaev
Привет всем!
Есть такой паттерн Service Object. И вроде бы всё ок за исключением того что все его понимают по своему (судя по коду) из разных проектов:
CreateUser.new.call(params)
CreateUser.new(params).call
CreateUser.call(params)
.run, .execute, что там ещё…
Кто-то возвращает только объект или nil, кто-то заворачивает, кто-то ошибки в errors оборачивает, кто-то бросает исключения. Какая-то вакханалия.
Я решил не городить свой и посмотреть есть ли какой простенький гем который реализует этот патерн и даёт уже набор готовых модулей. Кажется что это должно быть достаточно простой гем, но писать свой я не хочу пока не выяснил что других нет.
Так вот вопрос: как вы реализуете этот патерн у себя в проекте, что используете (свой набор базовых классов или готовое). И есть ли что в dry-rb такого? (dry-rb я не использовал)
Бери trailblazer::operation
источник

I

Ildar in Ruby, Rails, Hanami | dry-rb
Раньше, кстати, называл метод perform по аналогии с ActiveJob на которые очень похоже по структуре. Но потом услышал аргументацию про call и что можно использовать вместо proc и стал call исопльзовать в новых проектах.
источник

OA

Ortemy Alexandrovich in Ruby, Rails, Hanami | dry-rb
Не бери трейлблейзер, подумой
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Ortemy Alexandrovich
Не бери трейлблейзер, подумой
Зато опыт какой будет
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
Sergey Budaev
Привет всем!
Есть такой паттерн Service Object. И вроде бы всё ок за исключением того что все его понимают по своему (судя по коду) из разных проектов:
CreateUser.new.call(params)
CreateUser.new(params).call
CreateUser.call(params)
.run, .execute, что там ещё…
Кто-то возвращает только объект или nil, кто-то заворачивает, кто-то ошибки в errors оборачивает, кто-то бросает исключения. Какая-то вакханалия.
Я решил не городить свой и посмотреть есть ли какой простенький гем который реализует этот патерн и даёт уже набор готовых модулей. Кажется что это должно быть достаточно простой гем, но писать свой я не хочу пока не выяснил что других нет.
Так вот вопрос: как вы реализуете этот патерн у себя в проекте, что используете (свой набор базовых классов или готовое). И есть ли что в dry-rb такого? (dry-rb я не использовал)
Из гемов:

* ActiveInteraction ок — даёт валидации, руби не ломает
* ActiveInteractor вроде бы ок, но я не пробовал
* Interactor говнина и нельзя её брать
* Trailblazer::Operation щас хз в каком состоянии. Если Ник перепилит, будет ок
* dry-transactions не стоит брать, пока их не перепилили

Я как-то писал про разные подходы к дизайну этих объектов, и почему какие-то решения принимаются. Но там вывод будет один: не брать гем
источник

OA

Ortemy Alexandrovich in Ruby, Rails, Hanami | dry-rb
Vasyl Kuzmyk
Зато опыт какой будет
негативный
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
Ortemy Alexandrovich
негативный
а вы в дуалбуте активно юзаете трейлблейзер?
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Ortemy Alexandrovich
негативный
Беспорно, но зато поймет многое
источник

DM

Dmitriy Tensei Malys... in Ruby, Rails, Hanami | dry-rb
trailblazer не умер еще?)
источник

OA

Ortemy Alexandrovich in Ruby, Rails, Hanami | dry-rb
Cucumba Morozov
а вы в дуалбуте активно юзаете трейлблейзер?
нет канешна. Он же говно
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
а где ты успел с ним говна нажрать?
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
меня вот как-то избегала участь. только с reform нажрал
источник

AS

Alex Sherman in Ruby, Rails, Hanami | dry-rb
Cucumba Morozov
Из гемов:

* ActiveInteraction ок — даёт валидации, руби не ломает
* ActiveInteractor вроде бы ок, но я не пробовал
* Interactor говнина и нельзя её брать
* Trailblazer::Operation щас хз в каком состоянии. Если Ник перепилит, будет ок
* dry-transactions не стоит брать, пока их не перепилили

Я как-то писал про разные подходы к дизайну этих объектов, и почему какие-то решения принимаются. Но там вывод будет один: не брать гем
а почему Interactor говнина? Что-то ломает?
источник