Shub
а он сериализует эфшарповские типы очень своеобразно. и пока коммуникации внутри - то пофиг, но это вот надо слать наружу
Shub
как заставить Newtonsoft нормально сериализовать - наука пока не в курсе дела, Влашин про это ничего не писал
Shub
вообще тут конечно проебы на всех уровнях, начиная с моделлинга
Shub
десятикратно эффективный инженер не учел, что пользователь может не пожелать сообщать номер телефона или какие-то другие данные
Shub
метаться поздно, потому что моделька растащена уже по полсотни микросервисов, которые бодро отрапортованы как рабочие и давно засунуты в прод
Крылатый
Кстати.
Ayrat
Ayrat
Shub
Да нормально же, вербозно ДУ, но можно вылечить
в моей практике такого еще не случалось. все сторонние сериализаторы как правило друг с другом не совместимы и что-нибудь, да ломают. как по мне, то меньшее зло - это собственный кастомный сериализатор для конкретного поля и стараться избегать непереносимых типов
Shub
в принципе, к этому у нас и приходят, медленно и с мучениями
Ayrat
Shub
по Влашину, это должно было быть смоделировано типа так
Shub
type Contacts = Complete of { phone: Phone; address: Address}
| AddressOnly { address: Address}
| PhoneOnly { phone: Phone }
Shub
но прикиньте, как это сериализовать потом?
Roman
Зато к вам в команду надо ЕЩЁ собес проходить!т1
о, я как-то в епаме тоже попал на проект, где надо было проходить доп. собес. Погоняли по алгоритмам, внутренностям дотнета — в общем, классика. Прошел, пришел и охуел от говнокода.
Можт это маркер такой? Если есть "внутренний" доп собес, то проект — раковая пизда?
Ayrat
Roman
Doge
Shub
А почему не два Option поля?
Можно и два option, особенно если с ними ничего делать не надо. А если надо, то придется обрабатывать 4 возможных комбинации.
Ilya
Смело.
Doge
Shub
Смело.
Ну это все так предполагают
Крылатый
Крылатый
С госорганами.
Shub
А, я понял, что имеется в виду.
это все довольно спорно, конечно же. у нас в проекте в 90% случаев использование DU - это вытягивание какого-то флага на один уровень выше, ну например с адресами типа ConfirmedUser of { address: Address; name: string} | NonConfirmedUser of {name: string}
Shub
(это где была попытка че-то моделировать)
Shub
и мотивация мол есть статическая гарантия, что ты не передашь пользователя без адреса туда, где ожидается адрес
Ilya
А потом бац, и в address лежит "null".
Shub
что довольно странное объяснение для меня. во-первых, эфшарп не позволяет сматчить аргумент по кейсу как хаскель или эрланг. можно попытаться извернуться с active patterns, но оно тоже не пашет
Shub
то есть я должен вручную матчить каждый кейс. чем это отличается от ручной проверки флажка isConfirmed?
Shub
во-вторых, что делать, когда пофиг на кейс? таких случаев больше примерно на порядок
Shub
и судя по коду людей, которые пытались что-то сделать по этому поводу, так не только я думаю. по ходу, моделлинг на DU увеличивает требуемый код. причем не просто код, который один раз написал и не трогаешь, а в каждом случае нужно писать практически идентичный код
Shub
ну в смысле, добавил DU в доменный тип - и побежал писать простынки по всем слоям, чтоб сериализовать нормально, чтоб десериализовать нормально, чтобы матчи без ворнингов были и т.п.
Hog
Roman
Shub
не предполагает он этого
может и не предполагает, но тема неполных и меняющихся требований у него не раскрыта вообще
Roman
Чем точнее доменные типы соответствуют реальным вещам, тем удобней работать с этим кодом.
Разумеется, тут надо брать в расчет возможности языка и системы типов
Shub
вот этот код выше - он кстати оттуда и растет. 5 лет считалось, что пользователь обязан иметь эти данные и тупо не может без них существовать. а потом коммифорния приняла закон и нам нужно в моделях, проработавших верой и правдой учесть, что пользователь может быть тупым айдишником, вот так банально
Shub
Shub
может знания о них неполны, но открытые фундаментальные факты остаются неизменными
Roman
И исправить это было гораздо легче, пушто код показывал то, как оно сейчас работает
Shub
это говорит о качестве кода, но никак не говорит о количествах изменений, которые вам пришлось сделать
Roman
Потом мы передизайнили типы в то, как оно теперь должно работать, и после фикса компиляции все заработало правильно
Shub
Roman
Кол-во изменений тут вещь ортогональная
Shub
из реальности, в смысле, не из кода
Roman
пока не было
Shub
а у нас было
Roman
это говорит о качестве кода, но никак не говорит о количествах изменений, которые вам пришлось сделать
дело в том, что как бы код ни был организован (ддд или не ддд), он все равно сегодня работает именно так, как работает, а завтра нам приходит требование это изменить.
Если код читаем и бизнес правила из него легко вывести, то вносить изменения легко. Если домен по коду понять нельзя, то внесение изменений может лишь показаться простым , и то не всегда— в действительности, в таком коде просто трудно даже оценить, правильно ли он делает то, что должен делать
Roman
Ок, поправочка сразу
Roman
Вносить изменения может быть и не легко, но легко оценить правильность результата. Если код не отражает домен — вносить изменения легче не становится, при условии, что нас интересует соответствие доменной логике, а не изменения ради изменений
Shub
дело в том, что как бы код ни был организован (ддд или не ддд), он все равно сегодня работает именно так, как работает, а завтра нам приходит требование это изменить.
Если код читаем и бизнес правила из него легко вывести, то вносить изменения легко. Если домен по коду понять нельзя, то внесение изменений может лишь показаться простым , и то не всегда— в действительности, в таком коде просто трудно даже оценить, правильно ли он делает то, что должен делать
опять же, это подразумевает минимальные изменения в домене, когда ты изначально на 80% правильно смоделировал типы и отношения между ними, и потом ты только уточняешь поведение и структуру типа, причем в основном расширяешь
Shub
что в принципе случается довольно часто, особенно, когда люди не чтут за труд сначала разузнать свою предметку
Roman
ну если вы сильно ошиблись с дизайном домена — это в любом случае тяжело исправить
Roman
просто в некоторых подходах неправильность работы кода более очевидна, а в некоторых менее
Shub
ну в данном случае я не могу сказать, что ошиблись. кто бы мог пять лет назад сказать, что понятие "пользователь магазина" пропадет вообще?
Roman
я понимаю
Roman
Но не понятно, почему вдруг трудно просто добавить новый кейс в юнион тип
Shub
у нас на пользователя ссылалось дофига чего, а щас это просто эфемерный адрес, который мы даже персистить не можем, потому что ES внезапно иммутабельное
Shub
Но не понятно, почему вдруг трудно просто добавить новый кейс в юнион тип
ну надо различать "трудно" и "невозможно". трудно в основном потому, что потом тебе надо идти по всем местам расширять матчинг, что довольно забавная деятельность, особенно когда у тебя есть вайлдкард матчи - компилятор тебе и не скажет, что "вот тут надо добавить логику для твоего кейса"
Shub
так-то да, в хорошем и знакомом коде все можно
Roman
Shub
Roman
то, что вайлдкарды повтыкали — плохо, но не смертельно
Shub
но вообще оригинальный поинт был в том, что ДДД скорее мешает в случае exploratory programming - когда инженер изучает домен путем написания кода и сличает реакцию ПМа с эталонной
Anonymous
Anonymous
Даже Влашин не писал ничего.
Shub
Roman
Shub
в остальном это классический big ball of mud. но говорить об этом - жесткое табу