Vasily
Ну идея такая
Vasily
Ща у тебя есть CardName
Vasily
и Card
Vasily
Это можно объедлинить в один DU
Vasily
И в зависимости от него брать/не брать из базы
Vasily
Тогда у тебя сильно упрощаются сигнатуры функций
Roman
Идея интересная. А можешь семпл кода дать?
Vasily
type CardProxy= |NotLoaded of CardNumber |Loaded of Card
Vasily
Дальше пишется обобщенная функция вытаскивания из базы, если надо
Vasily
И условный deactivateCard - это (CardProxy->IoResult<CardProxy option>) list
Roman
type CardProxy= |NotLoaded of CardNumber |Loaded of Card
Для каждой сущнсти придется делать свою проксю? Не уверен, что можно будет нормально обобщить без натягивания совы на глобус то тут то там
Vasily
Так, стопэ
Vasily
Тэкс
Vasily
CardNumber- это номер банковской карты
Vasily
Как я понимаю
Vasily
В теории у нас тут может быть набор функций вида CardNumber->'t->CardNumber
Vasily
Точнее
Vasily
't->CardNumber->CardNumber
Vasily
Тогда через паршиал апплай можно делать всякое
Roman
В теории у нас тут может быть набор функций вида CardNumber->'t->CardNumber
почему? Скорее CardNumber * SomeCommand -> IoResult<Card> Либо я не так тебя понял
Vasily
Да
Vasily
Ты прав
Vasily
Если посмотреть на cardActions.fs
Vasily
То если там везде убрать card в конец функции, можно получить много вкусного
Roman
там она не в конце только в пеймент и топ-ап. Я так сделал, чтобы можно было через паршал апплай сделать серию платежей и пополнений, хотя пока это еще нигде не используется. А ради чего туда карту в конец ставить?
Vasily
Ну в теории у тебя тогда можно большие цепочки операций делать
Vasily
И, возможно, код попроще будет
Roman
но ты же вряд ли будешь делать один и тот же платеж для разных карт?
Roman
как и пополнение
Vasily
Мне лично не очень нравятся подобные сигнатуры: let setDailyLimit (currentDate: DateTimeOffset) (getCardAsync: CardNumber -> IoResult<Card option>) (replaceCardAsync: Card -> IoResult<unit>)
Roman
Мне лично не очень нравятся подобные сигнатуры: let setDailyLimit (currentDate: DateTimeOffset) (getCardAsync: CardNumber -> IoResult<Card option>) (replaceCardAsync: Card -> IoResult<unit>)
я тоже не фанат, но пока не понял, как сделать лучше. Все-таки зависимости как-то надо пробрасывать
Vasily
Хотя я в энтерпрайзе ничо не понимаю :)
Vasily
Ну я делаю мейлбокс обычно
Vasily
В него зависимости
Vasily
И уже его дергаю
Vasily
Если надо, оверрайдю
Roman
типа у тебя DI в нем?
Vasily
Ну условно
Vasily
Чтобы можно было при желании заоверрайдить, например, получение из базы
Roman
но если у тебя там нет нужной зависимости, то свалится в рантайме, так?
Roman
Чтобы можно было при желании заоверрайдить, например, получение из базы
ну так в моем коде ты можешь заинжектить любую функцию с подходящей сигнатурой
Roman
Одной из основных задач у меня было, чтобы как можно больше ошибок отлавливались в компайл тайме
Vasily
Только желательно, чтобы параметры были после функций, конечно
Vasily
Тогда это имеет смысл
Roman
А мейлбокс с DI это шаг в другом направлиении
Roman
ааа, текущую дату сдвинуть после зависимостей
Vasily
let processPayment (currentDate: DateTimeOffset) (getCardAsync: CardNumber -> IoResult<Card option>) (getTodayOperations: CardNumber * DateTimeOffset * DateTimeOffset -> IoResult<BalanceOperation list>) (saveCardAsync: Card -> IoResult<unit>) (saveBalanceOperation: BalanceOperation -> IoResult<unit>)
Roman
да, имеет смысл
Vasily
В теории currentDate должна быть в конце
Roman
гуд поинт, спасибо, поправлю
Vasily
Ну и есть ощущение, что все это можно зверски упростить
Vasily
Но надо подумать как
Roman
я пока не придумал)
Vasily
я пока не придумал)
Пока выглядит как оверинжиниринг
Shub
В теории currentDate должна быть в конце
в теории тут должен быть DI контейнер. но т.к. экосистема находится за чертой бедности, то предлагаю просто запилить контекст для зависимостей
Roman
в теории тут должен быть DI контейнер. но т.к. экосистема находится за чертой бедности, то предлагаю просто запилить контекст для зависимостей
я пока против DI контейнеров) Все, что можно сделать в компайл тайме надо сделать в компайл тайме. Или иметь оочень веские причины сдвинуть все в рантайм
Ayrat
Поставил sbt для скалы, пытаюсь скомпилить какой-то простенький хеловорлд. Яебал время компиляции. @DogeShibu, как вы там живёте, чаи гоняете пока билдится?
Vasily
Это ты ещё не пробовал сложный код писать
Ayrat
прям с разбега на скалу
Hog
СО
Hog
или ОБ
Roman
был Айрат и вот его не стало?
Shub
А за di контейнер поясни
чего за него пояснять, ты видишь, насколько тупая сигнатура у функции только потому, что кто-то решил делать все правильно?
Vasily
я походу скоро попробую.
Чо так? На фшарпе нет норм задач?
Ayrat
Чо так? На фшарпе нет норм задач?
есть, почему нет. Но тут на скале предложили прям совсем угар
Ayrat
От такого не отказываются наверное
Shub
Контекст надо передавать
если самопальный - то да. а в нормальном DI за тебя все придумали уже