- 1
- 2
- 3
// Всем привет. Я тоже принёс говнокода, но в необычном формате.
// А именно, я написал мини-книгу "60 антипаттернов для С++ программиста".
// https://pvs-studio.ru/ru/blog/posts/cpp/1053/
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
// Всем привет. Я тоже принёс говнокода, но в необычном формате.
// А именно, я написал мини-книгу "60 антипаттернов для С++ программиста".
// https://pvs-studio.ru/ru/blog/posts/cpp/1053/
Там вы найдёте и реальный C++ говнокод и просто вредные советы в духе "Пишите код так, как будто его будет читать председатель жюри IOCCC и он знает, где вы живёте (чтоб приехать и вручить вам приз)".
Если сразу не понятно почему "совет" вреден, то там есть соответствующий разбор.
Готов подискутировать про написанное. Ну и приглашаю накидывать в комментариях аналогичные советы.
P.S. Предупреждаю: там много букв. Сразу запасайтесь кофе/энергетиком. Или попкорном :)
j123123 15.06.2023 19:09 # +1
>
>Используйте при написании кода невидимые символы. Пусть ваш код работает магическим образом. Это прикольно.
Я б этот вредный совет расширил до "Используйте побольше символов за пределами ASCII"
Soul_re@ver 15.06.2023 20:42 # 0
j123123 15.06.2023 19:25 # +1
>
>Побольше кода в заголовочных файлах, ведь так гораздо удобнее, а время компиляции возрастает очень незначительно.
>
>В эпоху моды на header-only библиотеки этот совет не кажется таким уж и вредным. В конце концов, существует даже "A curated list of awesome header-only C++ libraries".
>
>Но одно дело – маленькие библиотеки. А другое – большой проект, в который вовлечены десятки людей и который развивается многие годы. В какой-то момент время компиляции вырастет с минут до часов, а сделать что-то с этим уже будет сложно. Не рефакторить же сотни и тысячи файлов, перенося реализацию функций из *.h в cpp-файлы? А если рефакторить, то не проще ли сразу было делать нормально? :)
А это уже проблема скорее компилятора, который не может быстро это делать. Допустим, есть некий .h файл где реализована некая шаблонная хренотень, есть куча .cpp файлов которые этот .h файл инклудят и каким-то образом используют, компилятор каждый раз с нуля все парсит в хедерах и специализирует, как это можно было бы исправить чтоб был быстро? Например, скомпилировать сам .h файл в некий промежуточный байткод, чтобы каждый раз не тратить время на его парсинг. Если во множестве файлов некий шаблон из хедера специализируется одним и тем же, это тоже можно как-нибудь закешировать и значительно ускорить компиляцию. Под что-то такое даже пилился специальный кеширующий компилятор zapcc https://github.com/yrnkrn/zapcc (основан на clang), но что-то не взлетело.
OPAHrymaH 15.06.2023 20:27 # +1
j123123 15.06.2023 20:39 # +2
OPAHrymaH 15.06.2023 21:09 # +1
https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html
ISO 15.06.2023 19:51 # +2
ISO 15.06.2023 19:54 # +1
JloJle4Ka 16.06.2023 11:39 # 0
OPAHrymaH 16.06.2023 11:52 # +1
guest6 16.06.2023 15:52 # 0
Soul_re@ver 15.06.2023 20:46 # +2
Утилиты автоформатирования, которы трогают строковые литералы — то ещё говно.
3a_O6e_Horu 15.06.2023 21:02 # +3
j123123 16.06.2023 09:25 # +2
Кривая утилита автоформатирования может и несколько пробелов скукожить в один(или заменить на таб), так что теперь, пробелы в строковых литералах не использовать?
3a_O6e_Horu 16.06.2023 16:23 # 0
Приоткрывается завеса на чём написана эта утялита.
guest6 16.06.2023 16:50 # 0
Это еще ничего. Некоторые утилиты автоформатирования и бизнес-логику править могут
3a_O6e_Horu 16.06.2023 17:01 # 0
Единственный вариант вижу: немного кривой выхлоп утялиты случайно совпадает с немного кривым видением смузихлёба, а потом немного кривой стартап и целая стая приматов с этим все живет от получки до получки
3a_O6e_Horu 16.06.2023 09:27 # +1
https://vk.com/wall639631882_932848?reply=932944
Унитаз воровать невыгодно через 3... 2...
Tike 16.06.2023 12:46 # 0
п-р сркн
Tike 16.06.2023 12:49 # 0
doomginho 28.08.2024 05:10 # 0
И им решительно похуй, кого перемолоть, если невовремя подвернуться под руку.
guest6 16.06.2023 15:53 # 0
Буду писать по комментарию про совет раз в час
guest6 16.06.2023 16:09 # 0
>>
Плохо, когда начинают использовать этот язык только потому, что это "круто" или это единственный язык, с которым хорошо знакома команда.
>>
Я бы разделил эти два понятия. "Круто" -- это для школьников, а вот выбирать язык потому, что с ним хорошо знакома ваша команда -- вполне логично.
Я чаще вижу обратную проблему: люди берут какой-нить Python "потому что нужно быстро", а потом у них все тормозит.
guest6 16.06.2023 16:12 # 0
>>случается, что программист вместо того, чтобы использовать '\t', не задумываясь, просто нажимает кнопку TAB.
Это странный аргумент. Случается так, что программист вместо "gcc" случайно нажимет "rm / -rf", но это не повод не пользоваться gcc.
>>На самом деле в литерале могут оказаться не табы, а пробелы. Это зависит от настроек редактора.
Пожалуйста всегда имейте одинаковые настройки у всех программистов проекта, и храние их в VCS, иначе у вас отбивка в каждой функции будет зависеть от предпочтений программиста
>>Явные символы табуляции использовались в перемешку с пробелами.
кошмар))) но я на лабах такое видел
OPAHrymaH 16.06.2023 16:24 # 0
3a_O6e_Horu 16.06.2023 16:48 # 0
guest6 16.06.2023 16:56 # 0
3a_O6e_Horu 16.06.2023 17:11 # 0
guest6 16.06.2023 16:51 # 0
3a_O6e_Horu 16.06.2023 16:13 # 0
guest6 16.06.2023 16:15 # +2
>>Вложенные макросы
Мне кажется, что макросы нужны только для совместимости с си. В плюсах макросы не нужны почти никогда.
OPAHrymaH 16.06.2023 16:32 # +1
Параметрические макросы? В крестах есть шаблонные функции. Ничем не хуже, заодно добавится проверка типов аргументов (мы же не на скриптовом языке пишем).
Что остаётся? #ifdef да #include. Остальные возможности макросов разве что для отладки.
Чуть не забыл про constexpr и consteval, которые могут в компилтайме выполнить то, что раньше делали макросами.
Soul_re@ver 16.06.2023 20:50 # +2
Чтобы делать что-то типа:
LOG(huita)
>> Value of "huita" is: 42
OPAHrymaH 16.06.2023 22:09 # 0
OPAHrymaH 16.06.2023 16:37 # 0
guest6 16.06.2023 16:40 # 0
А еще awk: папу перла, дедушку руби
OPAHrymaH 16.06.2023 16:41 # 0
guest6 16.06.2023 16:44 # 0
OPAHrymaH 16.06.2023 22:15 # 0
ISO 16.06.2023 20:58 # +1
j123123 17.06.2023 00:45 # 0
Вот взять пример из https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html :
Как это переписать без макроса, и при чем тут компилтайм-рефлексия?
guest6 17.06.2023 00:47 # 0
>>#EXP
j123123 17.06.2023 00:50 # 0
JloJle4Ka 19.06.2023 03:05 # 0
j123123 19.06.2023 12:34 # 0
JloJle4Ka 19.06.2023 17:21 # 0
Отражение (рефлексия; холоним интроспекции, англ. reflection) — процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения (мы говорим про рефлексию времени компиляции, к слову). Парадигма программирования, положенная в основу отражения, является одной из форм метапрограммирования[1] и называется рефлексивным программированием.
Таким образом, раз программа во время компиляции отслеживает собственную структуру (имена переменных), то это – частный случай рефлексии.
j123123 19.06.2023 18:03 # 0
JloJle4Ka 20.06.2023 03:25 # 0
j123123 20.06.2023 12:02 # 0
JloJle4Ka 20.06.2023 13:27 # 0
j123123 20.06.2023 13:57 # 0
JloJle4Ka 20.06.2023 14:52 # 0
Ты не прав, а я – прав. Потому что я выучил сишку.
Ты сейчас похож на человека, который не верит, что на C можно писать в ООП парадигме, т.к. в C отсутствуют т.н. "классы".
3a_O6e_Horu 20.06.2023 21:10 # +1
Ну а сам все налегает
На селедку иваси!
guest6 20.06.2023 21:16 # +1
И рубаю в маринаде салаку.
А на утро я от жажды мычу,
И хоть воду мне давай, хоть мочу!
guest6 17.06.2023 00:14 # −2
ну тут без комментариев. За заметание мусора под ковёр нужно гнать из профессии, да
>>Старайтесь, чтобы при компиляции проекта у вас не выдавалось ни одного предупреждения.
охох, может быть вам еще и 40 мигающих тестов не нравятся?:)
>>Вредный совет N5. Чем короче имя переменной, тем лучше
А вот в языке Го принято ИНОГДА давать корткие имена переменным (заместо this)
https://github.com/golang/go/wiki/CodeReviewComments#variable-names
Кроме того, есть всякие for(i и пр
Сокращать имена можно (arr и vec вместо array и vector, например)
>>Вредный совет N6. Невидимые символы
ну тут я могу только троллфейс нарисовать
_PHP_ 17.06.2023 07:25 # +2
guest6 18.06.2023 17:59 # +1
JloJle4Ka 17.06.2023 17:21 # 0
Мне искренне жаль автора, если он даже про утилиту "Indent" не слышал.