Shub
в том смысле, что ок, допустим не класс, допустим я сделаю рекорд с полем type
Hog
Shub
но все равно: матчить по DU или по полю рекорда (которое тоже DU) - разница небольшая
Vasily
Информацию о du все равно надо где-то хранить
Shub
Anonymous
Ну или я вообще не понял проьлему.
Shub
Vasily
Вопрос, как ты будешь информацию о пейлоде хранить
Anonymous
Vasily
Ну т.е. приезжает условный жсон
Vasily
Который надо десериализовать в определенный тип
Vasily
Откуда информация о типе будет взята?
Shub
Shub
что там внутри моего кода систему, мягко говоря, не волнует
Shub
варианты "завтра у вас появится другой ЯП" я оцениваю приблизительно с той же вероятностью, как и миграцию на AWS
AlexxSt
Shub
если бы этот жсон присылался мне от своих же - то это было бы полбеды, можно было бы банально слать f# представления жсонами, по крайней мере вопрос с быдлопарсингом снялся бы
Shub
как план Б я все же рассматриваю TypeShape\UnionEncoder
Shub
но еще больше хочется придумать обобщенный метод работы с этими ивентами, не описывая обработку каждого кейса вручную и не диспетчеризуя обработчики вручную
Shub
пусть работает железный паровоз, как говорится
Anonymous
Anonymous
Требования суровые?
Shub
шоб вам было понятно, в чем проблема - вот пример реального жсона
Shub
https://pastebin.com/cScLnEBJ
Anonymous
Линкедлист обработчиков до первого победителя сойдет?
Anonymous
Диспетчеризацию за тебя условный цикл фор и случай сделают
Shub
а, еще я забыл рассказать про нарушения контрактов, лол. например, поля, которые выглядят как enum - могут принимать пустые значения или вовсе null. в зависимости от значений других полей
Shub
dид советует писать все вручную. ну типа в деревнях вообще все вручную и ничего. ко мне уже стоит очередь свидетелей дида с книгой мормона в руках, но это такое, отобьемся, лол
Vasily
У тебя конечное число примитивных типов
Shub
только там возможностей ошибиться сильно дофига
Vasily
Соответственно, нужно промежуточное представление
Vasily
Я с таким баловался
Shub
у нас подавляющее большинство случаев - это DU, в каждой ветке которого одна структура
аля
type EventData = {}
type MyEvent = Created of EventData | Updated of EventData | Deleted of EventData
Shub
тут как бы сильно дохера шансов
Vasily
Одна и та же структура?
Anonymous
оно там щас так и сделано, посмотри по первой ссылке
это выглядит как неплохое решение с учетом нежелания ничего делать руками. единственное, что у тебя дофига типизации, а хендлеры могли бы получать тех же dynamic'ов, если лень типизировать и сваливаться при первой же неудаче в None например. цикл до первого Some result или логгирование того, что такой-то запрос не был обработан, т.к. не нашлось хендлера.
Anonymous
если нет требований к перфомансу, то так будет проще всего
Roman
Vasily
Я бы все же структуру данных поменял
Vasily
Ошибка в том , что десериализация должна быть не в рекорд
Shub
Vasily
Список ключ значение
Vasily
Чем жсон и является
Shub
Vasily
Соответственно сериализация и десериализация пишется руками один раз
Shub
Список ключ значение
и как это парсить потом? наличие ключа в жсоне в общем случае не гарантируется
Hog
Hog
Shub
Vasily
Бизнес рекорд в конструктор принимает такой список
Shub
может значения?
и того, и другого. жсон шлют разны системы, одни могут прислать key: null, другие могут key не прислать
значение null может быть допустимым при определенных значениях других полей
Vasily
Shub
Hog
тогда только как Василий предложил
Hog
Vasily
Shub
псевдокод бы не помешал, т.к. пока что это звучит "давай ты переименуешь этот метод в конструктор бизнесс-рекорда"
Vasily
Я про то, чтобы ввести слой промежуточного предоставления
Vasily
У тебя это что угодно будет нарушать
Roman
Не надо пытаться распарсить произвольный жсон сразу во вменяемое нечто с доменной точки зрения
Shub
вы че-то сконцентрировались на парсинге
Shub
валидация в моем случае крайне простая - я имею право просто игнорировать такие жсоны
Roman
бля, речь не про то, что ты сделаешь с невалидным жсоном, а про то, как отличить валидный от невалидного и как собрать из валидного жсона вменяемый тип
Shub
Shub
поинт в том, что DU - это невменяемый тип
Roman
хз, надо понимать доменную модель, чтобы сделать этот вывод или опровергнуть его
Shub
доменной модели как таковой нет, пайплайн, который слушает входящие от нескольких разных (но сходных) систем и складывает это в БД. вся логика - в экономии запросов в БД, ну типа комбинирование нескольких апдейтов в один
Shub
но блин из-за этого представления этих сообщений в виде du код раздувается как на дрожжах
Shub
и я задолбался ловить тупые ошибки за своими коллегами
Vasily