Здравствуйте, alpha21264, Вы писали:
A>В данном случае будет уместно сказать "учу читать".
A>Если пользоваться твоей аналогией про сахар, то это будет звучать так: A>сахара получается мало, а затрат на него много, в результате начинает не хватать на хлеб.
Соотношение сахара и затрат зависит от контекста. Скажем, если у тебя дешевое сырьё, делать сахар уместно. В противном случае — нет.
Предлагаю отделить для начала рассмотрение самой технологии от рассмотрения границ ее применимости.
Здравствуйте, alpha21264, в целом согласен, но скорее вижу проблемы не в конкретной проблеме типа Primitive Obsession vs Type-safe domain modeling, а когда какому-то подходу или методу придается слишком большое или универсальное значение в ущерб другим важным аспектам проекта. Так, например, 90% менеджеров 90% времени начинают говорить и думать, например, о Скраме, при этом проект проваливается, потому что успех определялся комплексом параметров — уровнем хардов команды, инженерной культурой, архитектурой, процессом развертывания, соответствия продукта рынку и и т.п. и т.д.
Тогда можно сказать, что миссионеры — это сторонники одной серебряной пули, которой, как правило, нет. Но время и комплексный поход могут быть уже упущены к тому моменту, когда закончатся деньги на продукт или компанию.
N>У европейцев спутник "Ариан-5" упал когда-то, с типом данных не угадали. Стоит ли работы программиста? N>Или сбой навигации у самолётов над Мёртвым морем, когда высота была отрицательной.
Там контроль типов не помог бы
Ну написал ты
uint8_t a=42;
uint8_t b=69;
uint8_t c=a-b;
Как тебя контроль типов спасёт?
По части const тс конечно ересь втирает, но по части "свой тип на свой домен" тут я во многом его понимаю, потому что это всего лишь порождает код засранный принудительными кастами к одниму числовому наиболее общему типу
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Быдлокодер, Вы писали:
Б>Интересно, а кто на практике использовал strongly typed domain modeling в реальном проекте? Какие результаты и выводы?
Я каждый раз когда подключаю std::chporno для замеров времени. Я эту парашу без гугла в жисть не повторю. С сишными функциями проще было. Да, баги вида "сложил секунды и милисекунды" возможны, но зато их легко обнаружить и пофиксить, чем каждый раз изучать доку на тему какой метод тут нужен для преобразования. Еще и какие-то систем клок, стеди клок, чё
Да и чисто психилогически мне поиск несоответствия в результате вывода комфортнее чем гуглинг и ковыряние в документации.
Короче я за примитив обсешшон. Доменный фанатизм фтопку
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Я каждый раз когда подключаю std::chporno для замеров времени. Я эту парашу без гугла в жисть не повторю. С сишными функциями проще было.
Счастливый ты человек. Ты никогда не сталкивался с точным измерением времени, синхронизацией, календарями, таймзонами, и т.п.
И да, C++ тут не при чём.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Счастливый ты человек. Ты никогда не сталкивался с точным измерением времени, синхронизацией, календарями, таймзонами, и т.п. ·>И да, C++ тут не при чём.
Насколько точным? Мне struct timeval с микросекундами как-то хватало всегда
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, so5team, Вы писали:
A>Когда я написал про illegal instruction, я написал что : A>1) Новый gcc вставляет в код illegal instruction, о чём его никто не просил.
Это вообще надо было сделать сразу. Но лучше позндо, чем никогда. Кстати, весьма вероятно, что у них есть ключик, чтобы вернуть старое поведение.
A>2) Полезные сообщения тонут в тоннах бесполезных.
Все сообщения полезны, и сигнализируют о том, что ты, скорее всего, делаешь что-то подозрительное. Проект должен собираться с ключиками -Wall -Werror
A>Ваша точка зрения, которую Вы защищаете - A>давайте нам ещё больше тонн бесполезных варнингов.
Это ты, привыкнув говнокодить, считаешь, что они бесполезны
S>>Честный желательно. Используете ли вы в своем коде классы? S>>Если используете, то есть ли в ваших классах const-методы?
A>Классы использую. A>const-методы не использую, потому что не знаю, зачем они нужны.
Их используют для того, чтобы компилятор мог определять возможность их вызова для константных объектов
A>У меня есть get-методы, но по моему это не одно и то же.
Твои get-методы могут поменять объект, но никто этого не заметит. Сколько чудных граблей ты раскладываешь в своём коде
A>Самое главное — я не понимаю, какое это имеет отношение к обсуждаемой теме.
Это твоя проблема
A>У меня такое впечатление, что Вы слишком много внимания уделяете инструменту и слишком мало задаче. A>Такое бывает, когда Вам не дают больших и интересных задач.
А ты не уделяешь внимания инструменту от слова вообще. Тебе микроскоп дадут, а ты им гвозди будешь забивать, потому что забивание гвоздей — это для тебя большая интересная задача.
Здравствуйте, T4r4sB, Вы писали:
TB>Как тебя контроль типов спасёт? TB>По части const тс конечно ересь втирает, но по части "свой тип на свой домен" тут я во многом его понимаю, потому что это всего лишь порождает код засранный принудительными кастами к одниму числовому наиболее общему типу
По-хорошему, разрешенные касты должны быть описаны, и не должно быть никаких принудительных кастов в прикладном коде
Здравствуйте, alpha21264, Вы писали:
Q>>Да разрабатывали как люди в машинных кодах, а потом пришли эти жертвы егэ т.е. миссионеры и все испортили.
A>Тебе не кажется, что твоя реплика похожа на кривляние?
Здравствуйте, Marty, Вы писали:
Q>>>Да разрабатывали как люди в машинных кодах, а потом пришли эти жертвы егэ т.е. миссионеры и все испортили.
A>>Тебе не кажется, что твоя реплика похожа на кривляние?
M>Не больше, чем твоя тема
Marty, сегодня ты не смешной.
Вообще, rsdn — это сайт, который крутится на компьютере Влада.
Я думаю, что не надо забивать его бессодержательными репликами.
Здравствуйте, alpha21264, Вы писали:
A>Допустим у нас есть несколько (ну допустим пять) величин: метры, килограммы, секунды, ньютоны и джоули. A>Да, их нельзя складывать с друг с другом. Но их можно(нужно) умножать и делить. A>Таким образом, чтобы написать формулу, которая содержит три величины, нам нужно иметь 3*(5+1)*(5+1) типов данных. A>То есть 36 типов для результатов умножения (килограмм*метр), A>И 2*36 типов для деления килограмм/метр и метр/килограмм. A>То есть, что-то около сотни типов. (Точная цифра =108) A>И чтобы над всем этим великолепием можно было выполнять действия, нужно 100*100 — десять тысяч функций.
Нужно, что бы компилятор умел
1. уметь поддержку единиц измерений
2. выводить типы из выражения
3. проверять соответсвие типов — уже умеет
В этом случае,
все типы он выведет сам, и будет делать это по месту переменной
никаких десять тысяч функций не нужно — вы пишете по одной, под конкретную формулу, а компилятор с остальным справляется сам
В этом случае вы не сможете силу передать как массу или энергию, а вот произведение ускорения на массу — с да, сможете
Здравствуйте, Marty, Вы писали:
M>По-хорошему, разрешенные касты должны быть описаны, и не должно быть никаких принудительных кастов в прикладном коде
Вот у тебя одна либа генерирует изображение в котором выдает координаты u64 а другая которая сохраняет принимает координаты в u32. В русте такой шизы очень много. Я спрашивал типа сделайте int64 для всех и не трахайте голову, а мне втирают что это примитив обсешшон и он приведет к проблемам. Ну пока что проблемы с тем что приходится принудительно писать касты и разбирать отдельно случай вычитания большего из меньшего
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
M>>По-хорошему, разрешенные касты должны быть описаны, и не должно быть никаких принудительных кастов в прикладном коде
TB>Вот у тебя одна либа генерирует изображение в котором выдает координаты u64 а другая которая сохраняет принимает координаты в u32. В русте такой шизы очень много. Я спрашивал типа сделайте int64 для всех и не трахайте голову, а мне втирают что это примитив обсешшон и он приведет к проблемам. Ну пока что проблемы с тем что приходится принудительно писать касты и разбирать отдельно случай вычитания большего из меньшего
Тебе не кажется, что это несколько другая ситуация?
Здравствуйте, Быдлокодер, Вы писали:
Б>Интересно, а кто на практике использовал strongly typed domain modeling в реальном проекте? Какие результаты и выводы?
Я использую, но у меня не физика, нет необходимости складывать/делить и исполнять прочую арифметику.
Зато есть объекты, для которых есть целочисленные идентификаторы (uintXX_t в основном).
И у одного и того же объекта может быть больше одного идентификатора, в зависимости от того, кому он передаётся.
вот и есть у меня:
using session_id_t = StrongTypedef<..., uint32_t>;
using nsapi_t = StrongTypedef<..., uint8_t>;
using teid_t = StrongTypedef<..., uint32_t>;
using eps_bearer_id_t = StrongTypedef<..., uint32_t>;
using qci_t = StrongTypedef<..., uint8_t>;
using nsapi_t = StrongTypedef<..., uint8_t>;
using qdisc_id_t = StrongTypedef<..., uint32_t>;
// ну и ещё с десяток-полтора подобного
Результат — код лучше, ловил несоответствие формальных и фактических параметров ф-ций по типу не раз. Прямо во время написания кода редактор показывает, что такой вызов не получится.
Лучше всего проявляло себя во время рефакторингов модели. Без использования StrongTypedef я бы просто боялся делать изменения тех масштабов, которые я делал.
Кроме того, упрощаются некоторые виды анализов кода. Например, я легко могу найти все API, работающие с данным типом, да и вообще все места его использования.
Для каких-то типов я вводил специальные форматтеры для записи в журнал. Например, если Wireshark показывает тип как шестнатиричное 8-хциферное число с ведущими нулями, то мне в журнале удобно его видеть ровно так же, и я переопределяю желаемый формат в одном месте, затем просто использую `{}` где нужно, и в выводе программы я увижу "0000beda", без необходимости выписывать форматную строку в каждом месте. До того, как я ввёл строгие типы, одни и те же значения печатались то как десятичные, то как шестнадцатиричные.
Было такое, что для решения одной проблемы, когда мне нужно было анализировать много выхлопа программы, я оборачивал вывод в декоратор типа `---0000beda---` для более простого парсинга скриптом, и добавлял в журнал коды для выделения этих значений цветом, для более удобного поиска глазами. И то, и другое делалось в одном месте. Если бы нужно было найти и попатчить все места использования этого типа, я бы просто этого делать не стал.
Я понимаю, что это не то же самое, что моделирование физики, где нужно комбинировать величины разных размерностей, что ведёт к комбинаторике. Была бы задача с физикой — обязательно бы попробовал с сильной типизацией. Не факт, что понравилось бы, нет такого опыта.
Здравствуйте, Marty, Вы писали:
M>Тебе не кажется, что это несколько другая ситуация?
Нет. Это бред с разным числовым типом на каждый чих — именно то, что мне обосновывали как "доменно-ориентированный тип". И как следствие — на стыке домена и своего кода ехал каст через каст
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
M>>Тебе не кажется, что это несколько другая ситуация?
TB>Нет. Это бред с разным числовым типом на каждый чих — именно то, что мне обосновывали как "доменно-ориентированный тип". И как следствие — на стыке домена и своего кода ехал каст через каст
Хернёй люди занимаются. Нет смысла в отсутствие нормального strong typedef'а
Здравствуйте, T4r4sB, Вы писали:
TB>Насколько точным? Мне struct timeval с микросекундами как-то хватало всегда
Слишком много ликбеза. Мне лень писать подробно. Но пара хинтов:
TB>Я каждый раз когда подключаю std::chporno для замеров времени.
И читаем: https://blog.habets.se/2010/09/gettimeofday-should-never-be-used-to-measure-time.html
TB>Еще и какие-то систем клок, стеди клок, чё
Это сисколлы, а не причуда std::chrono как тебе кажется: "kernel support the following clocks:" https://linux.die.net/man/3/clock_gettime
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, alpha21264, Вы писали:
A>Вообще, rsdn — это сайт, который крутится на компьютере Влада. A>Я думаю, что не надо забивать его бессодержательными репликами.
У современного диска быстрее кончается срок, когда на надёжность этого диска не страшно рассчитывать, чем место на нём...
Здравствуйте, Marty, Вы писали:
M>Да вот ещё, терпеть тебя. Нам просто на тебя наплевать. Просто мы теперь многое о тебе узнали, как и о качестве твоего софта. Ну и стало ясно, что твоё мнение немногого стоит, ты можешь лютую дичь нести с важным видом.
Знаешь, мне приходилось встречать людей, которые рассуждают, как Альфа, но при этом в состоянии надёжно работать. У них какие-то свои методы обеспечения надёжности, отличные от общепринятых.
В принципе, людям нашего с Альфой поколения это простительно: мы сложились, как профессионалы, раньше, чем это методы стали общепринятыми (ну и вообще, то, что сейчас считается общепринятым, во многом формировалось на наших глазах, и во многих точках вполне могло пойти по другой траектории).
Так что представления о качестве его софта из его слов не выведешь.
Здравствуйте, Pzz, Вы писали:
Pzz>Так что представления о качестве его софта из его слов не выведешь.
Проблема не в том, что кто-то пишет код с использованием ненадёжных, небезопасных подходов и практик.
Проблема — когда такие подходы продвигаются, как правильные, а сторонники практик, облегчающих написание надёжного кода, объявляются "истинными врагами". А человек, заявляющий "у меня длиннее", уж наверняка будет навязывать своё видение в команде.
Я знаю специалистов, на голову, а то и не одну выше меня, при этом defensive programming, эти все ассёрты, санитайзеры, юнит-тесты, повышенные уровни предупреждений, const-correctness, [nodiscard]], RAII, отказ от using-директив и пр. им "мешают творить".
Могу ли уважать такого человека, может, даже в чём-то и восхищаться? Да.
Захочу ли я с ним работать? Нет. Это будет боль или для него, или для меня, или для обоих. Я не настолько умён, чтобы отказываться от помощи инструментов. И большинство программистов — тоже.