Size: a a a

Saint P Ruby Community

2020 May 15

AD

Anton Davydov in Saint P Ruby Community
я о том, что у тебя есть бизнес логика, она вызывается где-то и сама логика еще требует вызов чего-то (библиотеки, стореджи всякие, другая часть логики и так далее). если не контролировать все это и пустить на самотек, получится система в которой каждый вызывает все подряд

как пример, я хочу иметь возможность вызывать бизнес логику только из экшенов + я хочу иметь возможность вызывать модели только из определенного слоя моего приложения (условно из сервисов). как мне это лучше сделать и как сделать так, что бы это соблюдалось на уровне всег проекта
источник

AD

Anton Davydov in Saint P Ruby Community
Dmitry
на каком уровне ты имеешь в виду изоляцию?
на уровне слоев + на уровне логического разделения предметной области (не мешать ордера с постами в блоге и так далее)
источник

NB

Nikita Bulai in Saint P Ruby Community
А, идею понял. Звучит резонно
источник

AD

Anton Davydov in Saint P Ruby Community
а, еще момент, я когда обзор кода делал (https://gist.github.com/davydovanton/a8f3cab112e43cfafbcbbfae2472f6c7) заметил странную особенность, часто в сервисы вытаскивают не часть бизнес флоу, а кусок имплементации, причем довольно часто эта имплементация связанна с базой
источник

AD

Anton Davydov in Saint P Ruby Community
там прямо в тексте пример будет о чем я говрю
источник

AD

Anton Davydov in Saint P Ruby Community
такое разделение приводит к похожему коду:
https://github.com/discourse/discourse/blob/master/app/services/color_scheme_revisor.rb

т.е. это кусок логики который больше подходит либо моделе, либо отдельной библиотеки, относящейся к предметной области.

смотря на такой код не очень понимаешь зачем оно вообще нужно, т.е. код не отвечает на вопрос “зачем”, но отвечает на вопрос “как”
источник

D

Dmitry in Saint P Ruby Community
ща прочитаю и сформулирую свои мысли
источник
2020 May 16

AD

Anton Davydov in Saint P Ruby Community
Anton Davydov
а, еще момент, я когда обзор кода делал (https://gist.github.com/davydovanton/a8f3cab112e43cfafbcbbfae2472f6c7) заметил странную особенность, часто в сервисы вытаскивают не часть бизнес флоу, а кусок имплементации, причем довольно часто эта имплементация связанна с базой
я быстрый тлдр добавлю, мой поинт в том, что вместо написания шагов выполнения кода, стоит посмотреть на то, как собственно бизнес работает с точки зрения логики и флоу данных. т.е. вместо UpdateUserService писать что-то более осмысленное с позиции того, что в реальности происходит
источник

AD

Anton Davydov in Saint P Ruby Community
тогда шаги выполнения становятся осмысленее и появляется контекст, который помогает разобраться в проблеме
источник

NB

Nikita Bulai in Saint P Ruby Community
Запахло идеями DDD
источник

AD

Anton Davydov in Saint P Ruby Community
все так
источник

AD

Anton Davydov in Saint P Ruby Community
ну, сложно это назвать прямо ДДД
источник

AD

Anton Davydov in Saint P Ruby Community
но идеи от эвент сторминга, да
источник

AC

Anton Chuchkalov in Saint P Ruby Community
Anton Davydov
я быстрый тлдр добавлю, мой поинт в том, что вместо написания шагов выполнения кода, стоит посмотреть на то, как собственно бизнес работает с точки зрения логики и флоу данных. т.е. вместо UpdateUserService писать что-то более осмысленное с позиции того, что в реальности происходит
Как-то у нас был класс ServerManager на 500-800 строк, точно не помню. Лежал в папке lib/services, и с ним было сложно работать.
В итоге я его переписал на кучку srp классов вида BootstrapServer, RenameServer, DeleteServer, DeployServer и прочие. Лежали они так же в lib/services, но работать было гораздо удобнее.

Мне кажется, не место влияет, а подход к написанию (это к одному из предыдущих сообщений про app/services)
источник

AC

Anton Chuchkalov in Saint P Ruby Community
Такой подход с добавлением глаголов в названия позволял не давать классам разбухать и проще следовать SRP было
источник

D

Dmitry in Saint P Ruby Community
Anton Davydov
это не решит проблем зависимостей между бизнес логикой, не решит проблемы кросс вызовов, не решит проблемы того, что люди пихают вообще все что угодно в сервисы и не решит проблемы изоляции областей (я бы сказал про домены, но думаю плохое слово тут). можно сказать, что энджины решают эту проблему, но я хз, мне кажется, что там те же самые проблемы будут
посмотрел твой пример, в целом ты говоришь про проблему coupling и cohesion (связанности) абстракций. и второй момент, про слишком "абстрактные" абстракции без осмысления бизнес-логики. я не знаю честно говоря, как первая проблема может решаться на уровне фреймворка, а вот по ддд в принципе, фреймворк мог бы давать рекомендации, но rails все-таки не ddd-шный фреймворк
источник

D

Dmitry in Saint P Ruby Community
Anton Chuchkalov
Как-то у нас был класс ServerManager на 500-800 строк, точно не помню. Лежал в папке lib/services, и с ним было сложно работать.
В итоге я его переписал на кучку srp классов вида BootstrapServer, RenameServer, DeleteServer, DeployServer и прочие. Лежали они так же в lib/services, но работать было гораздо удобнее.

Мне кажется, не место влияет, а подход к написанию (это к одному из предыдущих сообщений про app/services)
место, конечно, не влияет. можно в services запихать один класс, который будет про все. но идеалогически (в идеале) это должно подталкивать тебя к созданию абстракций, которые следуют srp и разделять консерны хотя бы на банальном уровне выделения логики из модели. то как ты будешь это реализовывать - это уже следующий, более сложный уровень
источник

D

Dmitry in Saint P Ruby Community
Anton Davydov
я быстрый тлдр добавлю, мой поинт в том, что вместо написания шагов выполнения кода, стоит посмотреть на то, как собственно бизнес работает с точки зрения логики и флоу данных. т.е. вместо UpdateUserService писать что-то более осмысленное с позиции того, что в реальности происходит
вообще, полностью согласен с идеей. у меня есть проект, где стоит над этим поразмышлять как раз тк я там реализовывал и разделял логику не на уровне бизнеса, а на уровне реализации фичи
источник

AC

Anton Chuchkalov in Saint P Ruby Community
Dmitry
место, конечно, не влияет. можно в services запихать один класс, который будет про все. но идеалогически (в идеале) это должно подталкивать тебя к созданию абстракций, которые следуют srp и разделять консерны хотя бы на банальном уровне выделения логики из модели. то как ты будешь это реализовывать - это уже следующий, более сложный уровень
Идеалогически — изящое слово😀
источник

D

Dmitry in Saint P Ruby Community
Anton Chuchkalov
Идеалогически — изящое слово😀
ну за любым решением, фреймворком стоить какая-то идеалогия
источник