IdiocyAcceptance
Vagif
Не то чтобы я очень активно это применяю, но вижу в этом резон.
IdiocyAcceptance
Особенно когда таких типов больше, чем 1.
Shub
В какой второй статье?
Effective ML revisited - это вторая статья по теме. Первая - это выступление в Корнуэлле, предназначенная для студентов, а потому полная капитанства для людей с «от 5 лет стажа»
IdiocyAcceptance
Vagif
Shub
Vagif
Vagif
Shub
Ну в принципе да
Но ведь этого никогда не произойдёт. Потому что по некоторому размышлению станет понятно, что этот тип нормально реализуется только как класс. А класс - это харам, Влашин накажет. Поэтому String50, тем более, что уже есть блог с реализацией, «все готово»
Shub
Shub
Дело не в управлении коллективом, это чисто дизайн
Vagif
IdiocyAcceptance
Особенно если оглядываться не на исключения, а на некоторый "правильный" ROP-подход
Shub
В прикладной продуктовой разработке не бывает финальных спецификаций. Любая спецификация будет изменяться вплоть до полностью противоположных требований. Поэтому любые попытки «зафиксировать инварианты» на любой из стадий сродни направлению заряженного солью дробовика себе в пах
Anonymous
Shub
Shub
В 99% кодерок пытается зафиксировать вообще не то и не так, прикрываясь какой-то там «корректностью»
Shub
Корректностью чего, спрашивается? Утром приходит ПМ и говорит «помните, мы запрещали пользователям делать Х? Короче, теперь можно и нужно делать Х» – ну и где теперь ваша корректность?
Anonymous
А то не очень понятно как надо.
Shub
Ilya
А потом придёт тг и скажет, что теперь id не помещаются в int32, надо 52 бита!
Shub
Shub
короче есть автоматическая система доставания предметов из коробок. огромная такая штука три этажа высотой.
Doge
Shub
общение с ней происходит через обмен сообщениями, сообщения представляют условно "команда-ответ": мы просим эту систему что-то сделать, система подтверждает согласие и репортит статусы обратно
Shub
условно назовем модель на нашей стороне "заданием". т.к. процесс небыстрый (физические предметы в физическом мире перемещаются как материальная точка по законам ньютоновской механики), пользователи хотят отслеживать состояние "задания"
Shub
ну вот год все работало по приблизительно такой логике: "задание отправлено" - "задание принято" - "предмет №1 достали" - "предмет №2 достали" - "задание закончено". альтернативное развитие событий - "задание отправлено" - "в задании отказано"
AlexB
ДДД в терминальной стадии?
В чём тут терминальность? Один тип натягивать на разные сущности - вот это действительно типичная "терминальность"
Shub
ну вот кодерок решил, что обладает всей полнотой знаний о возможных ситуациях и закодил модель "задание" как DU
Shub
более того, он там потратил кучу времени, чтобы не дай бог "задача" в неправильном состоянии не попала в ту или иную веточку. причем сделал он это довольно странно: все равно матчил и кидал исключение
Ilya
Shub
ну и случилась такая штука: выяснилось, что люди на складе тратят по нескольку часов вручную откатывая задания, которые посланы в эту штуку за 15 минут до отъезда последнего курьера - потому что процесс занимает минимум полчаса
Shub
причем сама эта штука автоматическая была в курсе этого всего и если там не удавалось достать какой-то предмет в течении заданного времени - задача отменялась с рассылкой уведомления во все заинтересованные в этом системы. в том числе и в нашу
Shub
ну мы по ходу просто падали с исключением, что банально рестартовало сервис. но я щас не об этом
Shub
ПМы посовещались и решили, что раз все вокруг могут корректно обрабатывать такую ситуацию - то и нам пожалуй тоже надо, не так ли?
AlexB
Shub
и вот внесение этого банального изменения вылилось в 3 недели работы. потому что теперь надо перелопатить весь этот безумный ФСМ и выпилить все эти проверки на "некорректное состояние". потому что оно внезапно стало корректное
Shub
и таких примеров у меня приблизительно все реквесты от продукта за последние 3 месяца.
Ilya
Shub
Ilya
Ну вот, так я уже делаю.
Shub
все правильно. айди сущности не имеет никакого отношения к логике продукта. поэтому оно должно быть скрыто от манипуляций и появляться только где-то там далеко в слое, отвественном за загрузку и сохранение.
Ilya
Shub
и если это как-то обусловлено независимыми от тебя обстоятельствами, время существования голых айдишников должно быть минимальным
Doge
И условно это самое MyEntityId и становится вырожденным обьектом сущности
Shub
Shub
что нормально. но это никак не означает, что для каждого айдишника надо заводить отдельный тип
Shub
и уж тем более это никак не оправдывает дел типа type MyCustomId = string
Shub
Shub
а, ну да.
Anonymous
Anonymous
а это история про чувака, который влез в проблему, не понимая всех частных случаев.
Shub
Anonymous
например, про любую тразнакцию можно с уверенность говорить, что она должна быть либо закомичена, либо заролбечена, но не то и другое вместе. это честный инвариант на уровне системы в целом. я про нечто такое.
Shub
поэтому для многих его совет звучит как "цементируйте ваше понимание немедленнно по получению первого задания"
Anonymous
Anonymous
я уже тогда поржал
Anonymous
Doge
Anonymous
Shub