60 антипаттернов для С++ программиста
От: Analytic2007 Россия https://www.viva64.com/ru/pvs-studio/
Дата: 14.06.23 18:56
Оценка: 26 (7)
Всем привет. Написал мини-книгу про вредные советы для программистов и приглашаю с ней познакомиться: 60 антипаттернов для С++ программиста. Всё будет одновременно и в шутку, и серьёзно. Как бы глупо ни смотрелся вредный совет, он не выдуман, а подсмотрен в реальном мире программирования. Естественно, каждый антисовет сопровождается объяснением, почему он вредный. Так что информации будет много. Запасайтесь кофе и желаю приятного чтения.
Если вспомнится своё наболевшее, тоже делитесь
Re: 60 антипаттернов для С++ программиста
От: Нomunculus Россия  
Дата: 14.06.23 19:05
Оценка:
Здравствуйте, Analytic2007, Вы писали:

Что-то большинство ну совсем примитивные. Типа == для даблов. Хоть один сишник делает так? Вредность const — что?? Кто так вообще считает?
Re[2]: 60 антипаттернов для С++ программиста
От: Analytic2007 Россия https://www.viva64.com/ru/pvs-studio/
Дата: 14.06.23 19:27
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Что-то большинство ну совсем примитивные. Типа == для даблов. Хоть один сишник делает так?


Вполне Добро пожаловать в реальный мир программирования.

О том, как мы опробовали статический анализ на своем проекте учебного симулятора рентгенэндоваскулярной хирургии

> Подобные ошибки повторяются достаточно часто в данной библиотеке. Не скажу, что это стало для меня неожиданностью. Уже ранее наталкивался на некорректную работу с числами с плавающей точкой в этом проекте. Однако систематически проверять исходники на этот счет не было ресурсов. По результатам проверки стало ясно, что нужно дать разработчику почитать что-то для расширения кругозора в части работы с числами с плавающей точкой. Скинул ему ссылки на пару хороших статей
Re: 60 антипаттернов для С++ программиста
От: rg45 СССР  
Дата: 14.06.23 22:44
Оценка: 2 (1) +4
Здравствуйте, Analytic2007, Вы писали:

A>Всем привет. Написал мини-книгу про вредные советы для программистов и приглашаю с ней познакомиться: 60 антипаттернов для С++ программиста. Всё будет одновременно и в шутку, и серьёзно. Как бы глупо ни смотрелся вредный совет, он не выдуман, а подсмотрен в реальном мире программирования. Естественно, каждый антисовет сопровождается объяснением, почему он вредный. Так что информации будет много. Запасайтесь кофе и желаю приятного чтения.

A>Если вспомнится своё наболевшее, тоже делитесь

Имхо, стиль "вредных советов" не очень подходит для публикаций по C++. Оно-то может и кажется остроумным, на первый взгляд. Но когда дело дойдет до каких-то не совсем тривиальных вещей, которых в С++ хоть пруд пруди, да захочется предоставить какие-нибудь примеры кода, вписаться в этот стиль может оказаться не так-то просто. Кроме того, при чтении этих материалов будет не очень-то комфортно постоянно держать в голове необходимость инверсии рекомендаций, особенно новичкам.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: 60 антипаттернов для С++ программиста
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 15.06.23 07:11
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н> Типа == для даблов. Хоть один сишник делает так?


Так можно делать и в статье написано когда.
С другой стороны, эта тема слишком глубока и то же сравнение с поправкой на double epsilon неверно.
Даже если результат меньше единицы, эта странная константа может не подойти. Например, значение функции всегда меньше 1, но вычисляется она с помощью рядов, члены которых могут быть сколь угодно огромными (вспоминается функция Бесселя, где участвует и степень, и факториал). Кроме того, формула может быть неустойчива, промежуточные результаты округляются в соответствии с погрешностью исходных данных в промежуточных вычислениях и т.д.
По итогу, для корректной работы с такими числами иногда надо прослушать университетский курс по погрешностям, устойчивости и вычислительным экспериментам. Знания того, как работает компилятор и что происходит в регистрах окажется мало.
Re[3]: 60 антипаттернов для С++ программиста
От: Нomunculus Россия  
Дата: 15.06.23 07:15
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Так можно делать и в статье написано когда.


Для таких проверок предпочитаю булевый флаг заводить — было изменено значение или нет
Re[4]: 60 антипаттернов для С++ программиста
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 15.06.23 07:24
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Для таких проверок предпочитаю булевый флаг заводить — было изменено значение или нет


Или 100 булевых флагов, если значения не вычисляются, а присваиваются константы. Или 1000 флагов, если у нас константный LUT, с которым надо сравниваться. Детский сад.
Re[5]: 60 антипаттернов для С++ программиста
От: Нomunculus Россия  
Дата: 15.06.23 07:26
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Детский сад.


Детский сад — кривляться и доводить до абсурда
Re: 60 антипаттернов для С++ программиста
От: fk0 Россия https://fk0.name
Дата: 15.06.23 08:02
Оценка: -1
Здравствуйте, Analytic2007, Вы писали:

A>Всем привет. Написал мини-книгу про вредные советы для программистов и приглашаю с ней познакомиться.


После надписи PVS-Studio дальше не читал -- обычно полное фуфло, лишь бы студию свою впарить.
Коммерции здесь не место.
Re[2]: 60 антипаттернов для С++ программиста
От: qaz77  
Дата: 15.06.23 16:51
Оценка:
Здравствуйте, Нomunculus, Вы писали:
Н>Типа == для даблов.

Наиболее адекватное решение сравнения на равенство floating point я видел в библиотеке google test.
Для тестов используются макросы EXPECT_EQ/ASSERT_EQ, которые для fp типов не используют оператор ==.

Кому интересно, посмотрите файл internal/gtest-internal.h.
Там есть шаблонный класс FloatingPoint<RawType>.
В нем метод AlmostEquals, который игнорирует различия в kMaxUlps=4 в дистанции между представимыми значениями мантиссы.
Re: 60 антипаттернов для С++ программиста
От: qaz77  
Дата: 15.06.23 20:43
Оценка:
Здравствуйте, Analytic2007, Вы писали:

A>Вредный совет N37. Создай свой h-квест

A>Пишите ваши .h-файлы так, чтобы они зависели от других заголовков, и при этом не включайте их в свой заголовочный файл. Пусть тот, кто инклудит, догадается, какие A>заголовки нужно заранее заинклудить перед использованием вашего файла. Развлеките коллег квестами!

Спорный момент.
Для библиотечного кода эта рекомендация имеет смысл.
Кому хочется копаться в кишках чужой библиотеки чтобы выяснить, что там от чего зависит?

В рамках же своего проекта хочется иметь больший контроль над зависимостями, какие каждый .cpp включает .h.
Очень помогают уменьшить связанность кода forward объявления.

Для своего кода у меня правило: никаких #include в .h (кроме прекомпайлед хидеров, конечно).
Отредактировано 15.06.2023 20:45 qaz77 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.