Roman
@vshapenko ща играю с интерпретатором. Ты делаешь 1 сет инструкций на 1 сущность или на 1 боундед контекст?
Roman
Сет инструкций — это типа DU, который по сути представляет дерево исполнения программы. Кажется, ты это называл CardProxy в своем примере. Выглядит примерно так: type CardInstruction<'a> = | GetCard of CardNumber * (Card -> CardInstruction<'a>) | SaveCard of Card * (unit -> CardInstruction<'a>) | Stop of 'a Проблема тут в том, что нужны другие сущности, например, аккаунт инфа или сам юзер. Поэтому тут нужно либо расширять этот ДУ кейсами GetAccountInfo и тд либо делать 1 штуку на весь баундед контекст, в котором будет вообще все. Я вот склоняюсь ко второму варианту
Vasily
Смари
Vasily
У тебя есть контекст исполнения
Vasily
Который все умеет
Vasily
Дальше у тебя есть сет инструкций
Roman
делаю по примеру отсюда https://stackoverflow.com/a/51262899/6198294
Vasily
А, ты во фри монады упоролся
Roman
нене
Roman
в ответе чисто интепретатор
Roman
Я пытаюсь оценить трудозатраты на всю эту обвязку — мб они будут не сильно велики и тогда это будет лучше, чем просто паршл аппликейшн
Vasily
Тэкс, Card->CardInstruction, как я понимаю, задает следующий стейт
Roman
да
Vasily
ВОт что делает unit->CardInstruction, неясно
Roman
типа сохраняет в базу. Для того, чтобы потом в do!... пихать это
Vasily
Этого не должно быть в инструкциях
Vasily
В инструкциях по идее должно быть то, что я хочу сделать и то, что хочу в теории вернуть
Vasily
Хотя насчет вернуть у меня сомнения
Roman
куда ж тогда инжектить сейв в бд? Или типа ты сохраняешь то, что вернул, снаружи?
Vasily
Идея в том, что у меня есть некий ctx
Vasily
Куда я передаю этот сет инструкций
Vasily
И он уже сохраняет в бд и прочее
Roman
ну этот некий контекст — это интепретатор твоего дерева исполнения?
Vasily
Ага
Vasily
Но дерево там должно быть тупое
Roman
ну, так это не значит, что не нужно делать сейв-узел в дереве
Roman
то есть дерево останется чистой структурой
Vasily
Ты делаешь AddCard
Vasily
Результат каждой операции по идее должен быть сохранен в базу
Vasily
Если мы про финтех
Roman
допустим
Vasily
Т.е. каждая инструкция у меня порождает набор некоторых атомарных операций
Vasily
Например, сохранить в базе
Vasily
Взять из базы по айдишнику
Vasily
В нашем случае это в общем-то три операции, insert,delete,get
Vasily
Например, AddCard превращается в цепочку операции сохранения в базе плюс, возможно, возврат какого-то результата
Roman
В нашем случае это в общем-то три операции, insert,delete,get
ну то есть у тебя уже в инструкциях должны быть заложены эти операции, так?
Vasily
Это операции, относяциеся к конкретной реализации бд
Roman
да, я говорю не про имплементацию
Vasily
Или моего контекста
Roman
а про плейсхолдер для них в дереве
Vasily
Плейсхолдер там не нужен
Vasily
На разных контекстах может быть разная логика исполнения
Roman
а можешь набросать гист для простого сценария?
Roman
Типа взять по айдишнику - обновить - сохранить
Vasily
Ну ща попробуем
Vasily
Чет наговнякал
Vasily
Но выражать мысли у меня не свсегда складно получается
Vasily
https://gist.github.com/vshapenko/d7f5e068c18c06506a61ddd6079c1ce0
Vasily
Идея требует доведения до ума
Snejana ONE LOVE
Идея требует доведения до ума
Ум требует доведения до идеи
Roman
че-то не понял, зачем там тип Domain
Vasily
че-то не понял, зачем там тип Domain
Ну если нам нужен экшн, который что-то возвращает, может пригодиться
Roman
а в Action только операции, связанные с бд? Или маппинг моделей и валидация там тоже может быть?
Vasily
Экшн ничо про бд не знает
Vasily
Это условно бизнес кейсы
Roman
типа бизнес-операции? В духе "активируй карту", "полони баланс" и тд?
Roman
ок, 1 такой тип на 1 баундед контекст?
Vasily
Но тут надо не проебаться с уровнем детализации
Vasily
Ща, я попытаюсь вспомнить, шо есть bounded context
Vasily
Так, почитал
Vasily
Да
Vasily
Один тип на контекст
Roman
ок, с этим понятно. Как в этой схеме собирается реальный пайплайн? Id -> Card -> UpdatedCard -> CardModel?
Vasily
Судя по всему, руками
Vasily
Ну т.е. на самом деле зависит от того, насколько нам дорого на каждом этапе из базы доставать
Vasily
Так, чет меня уносить стало не в ту ступь, походу
Vasily
Еще чуть-чуть, и начну нести херню в массы
Roman
то есть на самом верху объявляешь пачку функций processAction, и на самом же верхнем слое собираешь что-то типа let processPayment p = getUser p.User getCard p.Card и тд?
Roman
мне не нравится, что определение порядка действий уходит из доменного слоя
Vasily
Ну в разных контекстах разный порядок действий
Roman
поясни
Vasily
Нам главное, чтобы операции бизнеса в правильном порядке шли
Roman
да, но тут получается, что порядок бизнес операций определяется за пределами бизнес-слоя
Vasily
А внутри операции нам в целом неважно, начитываем мы сначала аккаунт отправителя или получателя