Vasiliy
Посмотрел разные выступления людей и там любят показывать пример:
если есть какой-нибудь enum, обозначающий состояние этого класса, то через DU можно их выразить так, чтобы не использовать enum. (и как раз используем компилятор в помощь, чтобы убрать бизнес ошибки)
Например, у меня есть вот такой енам:
public enum SessionStates
{
NotSet = 0,
Created = 1,
Delivery = 2,
ReadyToCreate = 3,
ContractCreated = 4,
SignInProgress = 5,
Signed = 6,
OnlineApp = 7,
Cancelled = 8,
Error = 9,
DboAgreed = 10,
ChildInfoSaved = 12,
}
был бы смысл делать из такого enum 12 разных рекордов с разными состояниями?
Vasily
Зачем?
IdiocyAcceptance
ChildInfoSaved = 12, - прикольное состояние
Pavel S
Посмотрел разные выступления людей и там любят показывать пример:
если есть какой-нибудь enum, обозначающий состояние этого класса, то через DU можно их выразить так, чтобы не использовать enum. (и как раз используем компилятор в помощь, чтобы убрать бизнес ошибки)
Например, у меня есть вот такой енам:
public enum SessionStates
{
NotSet = 0,
Created = 1,
Delivery = 2,
ReadyToCreate = 3,
ContractCreated = 4,
SignInProgress = 5,
Signed = 6,
OnlineApp = 7,
Cancelled = 8,
Error = 9,
DboAgreed = 10,
ChildInfoSaved = 12,
}
был бы смысл делать из такого enum 12 разных рекордов с разными состояниями?
Может там про du говорили? DU имеет смысл
Vasiliy
ну да. там про DU
Ayrat
Ayrat
Vasiliy
Зачем?
чтобы как я понял, было бы такое
type Session =
| NotSetSession of
| CreatedSession of
| DeliverySession of
и т.д.
Vasiliy
ну и соответственно в коде можно будет использовать рекорды NotSetSession и т.п.
только вот где тот предел кол-ва типов что ли
Vasiliy
хотя с кол-вом 12 я бы сказал что это оверинжениинг
Pavel S
Зачем тут рекорды? DU чтоб компилер в матчинге точно знал что есть неприкрытый кэйс, с енумом он есть всегда
Denis
Vasiliy
о, норм. подумаю)
Ilya
Пожалуй, даже если данные у кейсов ду не отличаются, можно будет указать конкретный кейс в сигнатуре функции и избавиться от проверки внутри. К тому же, при необходимости проще добавить новые данные конкретным состояниям.
Roman
Hog
Шалом, православные!
Hog
Chag Pesach Sameach!
Ilya
Уже таки Песах?
Hog
Завтра :)
Viacheslav
Hog
Vasiliy
Vasiliy
ну запихнуть 1 DU я могу и в c# классе
Viacheslav
Как это? Компилируется же! 🤣
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AbEAzAzmgFxAEsMAfCABxgDsACAZQE9cCYBbAWACgeCnqdACIBVOgF46AQTpk6AIR58BMOgCUYkKABMJdAN7CAriGEiA3HQCSp4jQJ0Avku4YYD7HSgSedP3XYAQwIwAAsvOgB3YgJQ3385QyEjPSlLKz1iJzo4AD46Sig7Amx6ACIAUikyr3i/ROM9eXTM7LyCovtSukrqryA
Не, всё ок, я чот думал, что он не сможет определить, что все кейсы сматчены
Roman
А как же идея сделать Неявное Явным?
А что тут неявного? Оба варианта выражают абсолютно одно и то же с одинаковой степенью гарантии. Только в одном случае ты напрямую используешь произведение типов (рекорд), а в другом сложение, и складываешь n раз подряд
Shub
Shub
Посмотрел разные выступления людей и там любят показывать пример:
если есть какой-нибудь enum, обозначающий состояние этого класса, то через DU можно их выразить так, чтобы не использовать enum. (и как раз используем компилятор в помощь, чтобы убрать бизнес ошибки)
Например, у меня есть вот такой енам:
public enum SessionStates
{
NotSet = 0,
Created = 1,
Delivery = 2,
ReadyToCreate = 3,
ContractCreated = 4,
SignInProgress = 5,
Signed = 6,
OnlineApp = 7,
Cancelled = 8,
Error = 9,
DboAgreed = 10,
ChildInfoSaved = 12,
}
был бы смысл делать из такого enum 12 разных рекордов с разными состояниями?
Согласно влашинцам только так и следует делать. ПОТОМУ ЧТО.
Сейчас мне достался проект на 10kloc, написанный в таком стиле и там тупо невозможно делать новые фичи. Но это даже не самое главное. Главное, что компилятор там нихера не «ловит ошибочные состояния», на проекте открыто порядка 50 багов касаемых именно состояний
Vasily
Джоба сама себя не засекурит
Vasily
Дедушка сочится ядом
Vagif
Посмотрел разные выступления людей и там любят показывать пример:
если есть какой-нибудь enum, обозначающий состояние этого класса, то через DU можно их выразить так, чтобы не использовать enum. (и как раз используем компилятор в помощь, чтобы убрать бизнес ошибки)
Например, у меня есть вот такой енам:
public enum SessionStates
{
NotSet = 0,
Created = 1,
Delivery = 2,
ReadyToCreate = 3,
ContractCreated = 4,
SignInProgress = 5,
Signed = 6,
OnlineApp = 7,
Cancelled = 8,
Error = 9,
DboAgreed = 10,
ChildInfoSaved = 12,
}
был бы смысл делать из такого enum 12 разных рекордов с разными состояниями?
Необязательно 12 разных рекордов, но если, например, ContractCreated содержит в себе дату создания контракта, не вижу причин, почему бы это не выразить как ContractCreated of CreationDetails
Hog
Vagif
Но вообще говоря, важно понимать, как этот State используется.
Shub
Vagif
Если по смыслу это именно enum для показа, в каком состоянии находится FSM, то не нужны никакие рекорды. Если же это само по сути состояние, то дополнительная информация нужна
Vagif
Ну и Active pattern is your friend, конечно. Мы вовсю их используем
Shub
Единственное, чего добиваются сторонники «модель как DU” - это вытаскивание какого-то случайного поля-статуса на уровень выше. Очень смешно делается, когда таких статусов несколько, я прямо хохочу до упаду
Vasiliy
а, да тоже подумал сегодня, типо что делать если таких полей несколько
Shub
Vasiliy
Vasiliy
Hog
И тут же побежал так писать?
Vasiliy
ха, было бы где так писать!
Hog
Мне чот сразу показалось, что там кода на порядки больше. И я забил
Shub
Make implicit explicit - это из zen of Python, т несет вполне конкретный смысл в том контексте. Я тебе гарантирую, что ни Влашин, ни миллионы его леммингов с этим смыслом не знакомы
Hog
А невозможные состояния пусть тестеры отлавливают
Hog
Это тоже Влашин? Там вроде было про невозможные неправильные состояния
Shub
Illegal state unrepresentable - это статья Йарона Мински, состоящая из размахиваний руками более чем на 95%. Влашин взял лозунг на знамена и просто размахивает руками немножко иначе.
Vasiliy
никому не угодишь :D
Hog
Vasiliy
Ха, потом придут и скажут, что за гавно ты тут написал
Hog
@nigurrath у тебя сегодня выходной? :)
Hog
Shub
Нашел статью кстати, называется Effective ML revisited
Vagif
Shub
Hog
Ой
Shub
Про Влашина и хорошие места его блога было сказано много и неоднократно. Влашин не виноват, что поколение твиттера не может вместить больше, чем книжечка на 150 страничек
Vagif
Shub
Ну или может некоторым для очистки Геракл нужен
Ilya
Интересная дискуссия.
Vagif
IdiocyAcceptance
Мне кажется лучше чётко сформулировать свою точку зрения о "making illegal state unrepresentable" через призму F#, а то ответов, если честно, все эти обвинения не дают)
Vasiliy
интересно однако
https://t.me/theworldisnoteasy/1248
Vagif
Я просто вижу примеры конкретного дизайна, когда разработчики, ссылаясь на Мински (а многие приписывают эту цитату Влашину), убирают из своих типов option и nullable, делая модель более строгой и жесткой. Не совсем понимаю, что в этом может раздражать.
IdiocyAcceptance
Vagif
То есть несколько лет назад разработчик заводил один тип для RegisteredUser и UnregisteredUser, задавая в нем First/LastName как option. После прочтения этих блогов и книжек тот же разработчик заводит два типа, и в каждом заданы только обязательные поля. Налицо профит
Ilya
Vagif
Vagif