7

Ох уж этот *СиПлюсПлас*

Так получилось что я научился писать на языке С++. Как так получилось? Амбиции, тщеславие, желание выебнуться. Главные чувства, пульсирующие в моём сердце, когда я слушал лекцию Рылова В. по плюсам в нгу на фите. До сих пор помню его слова:

Спустя два года изучения, я понял что знаю весь язык в совершенстве. Спустя семь лет практики я осознал, что не знаю его совсем.

(с) Рылов В.

Я начал кодить на плюсах примерно на втором курсе универа, т.е. 2015 год. Сейчас двадцать четвертый, жесть. Девять лет прошло. Конечно я не кодил непрерывно на этом языке. Последний год до работы на заводе я вообще бросил их, обещая себе наивно, что не вернусь к ним. Думал, что перешёл на Python. Но... Вот я снова с ними. В первые года отношений я испытывал влюблённость, меня тянуло к ним как сейчас тянет к своей мадам. Но потом стали появляться звоночки. Причём громкие. Мне больно было слушать их. Сердце разрывалось. Я не понимал, язык ведь идеальный, на нём можно столько крутого всего делать. На нём делают ААА игры (и ни на чём больше!), потому что такой уровень науки (да-да, в компьютерных играх используются бешенные технологии) можно захерачить только там. Чтобы игра выглядела красиво, игралась драйвово, ничего не лагало. На этом языке такие мощные штуки делаются, ну разве кроме запуска ракет. Там вроде до сих пор Fortran в моде. Короч писец. Язык крутой. И понятное дело не простой. На нём сложно (тогда мне казалось, что это сложно, хи-хи-хи) программировать. Я принял эти правила. Но почему было так больно. Когда...

Я уже не вспомню, что конкретно мне отдавало болью. Поэтому поделюсь сегодняшней задачкой. Я на неё потратил полдня. Первые полдня я создавал этот канал. Тайм-менеджмент на вершине! Так вот, есть такой код:

Ох уж этот *СиПлюсПлас* Мат, Программист, Смешанные чувства, Бомбёж, Страсть, C++, Длиннопост

Вывод:

0a


Код выводит число в шестнадцатеричном формате. Мне, как embedded программисту часто приходится работать именно с этим представлением. Выяснил, что плюсах до 20 стандарта вообще какие-то проблемы с выводом шестнадцатеричных чисел. Есть функции на Си, но блинский, плюсы, ё-моё, а своё?

Идём дальше. Теперь нам потребовалось написать вот так:

Ох уж этот *СиПлюсПлас* Мат, Программист, Смешанные чувства, Бомбёж, Страсть, C++, Длиннопост

Вывод:

15 45 e4

Да, кто внимательный, заметил, что пиздец чёт дохуя одинаковой хуйни. Программист на то и программист, что любит избавляться от дублирования. Я по крайней мере точно, у меня это синдром. Прям не могу спокойно на это смотреть. Я специально использовал переменные разного типа данных, чтобы не было соблазна запихать их в массив и в цикле перебрать это добро. Поэтому решение с моей колокольни лишь одно: нужно реализовать собственный манипулятор ввода/вывода, по примеру с setw, setfill или hex. Как истинный гуру программирования я заглянул в свою душу, чтобы отыскать ответ, а душа мне говорит:

Гугли. Ну а хули, я загуглил. Вот ответ. Портянка слабо говоря немаленькая (именно длину кода я имею в виду). Однако у меня получилось встроить её в проект:

Ох уж этот *СиПлюсПлас* Мат, Программист, Смешанные чувства, Бомбёж, Страсть, C++, Длиннопост
Ох уж этот *СиПлюсПлас* Мат, Программист, Смешанные чувства, Бомбёж, Страсть, C++, Длиннопост

Итого, что мы имеем. Я добился уменьшения длины строки. Теперь вместо

<< std::setw(2) << std::setfill('0') << std::hex << (int)a

я напишу:

<< Utils::hex << a

Результат на лицо. Я доволен. Пока не начал считать строки кода...

Было 6 строк кода, а теперь 32! Вау, сэкономил ... длину строки. Да, конечно я могу вынести пространство Utils в отдельный файл и подгружать, когда мне нужно воспользоваться этим "волшебным" манипулятором ввода/вывода. НО: а я воспользуюсь им вообще когда-нибудь? Зачем я потратил 4 рабочих часа на это? Ну были бы у меня те 3 длинные строчки (в рабочем проекте мне нужно вывести 6 переменных, но написать пришлось бы всего один разок). Что я получил? На самом деле я получил удовлетворение. Малюсенькое. Да, теперь я спокоен. Но проблема в том, что я это не контролирую. Если я вижу, что могу что-то улучшить, я это делаю практически не задумываясь, чего мне это будет стоить. Сколько сил уйдёт.

Да, вы можете сказать, что не в языке дело, а во мне. Да, это правда. НО блять сука но. Но заключается в том, что этот язык, язык С++ даёт мне кучу возможностей для улучшения. Буквально бесконечную возможность способов себя заебать.

Не так: "я могу вот так сделать круто, а могу вот так круто сделать". Нет. Я могу попробовать 10 способов, которые в результате не дадут никакого эффекта. И только сука 11 способ приведёт меня туда, куда нужно, удовлетворив мой тщеславный перфекционизм. Язык как будто поощряет меня ебать себя через колено. И я как наркоман этим пользуюсь.

В целом вот весь тэйк, я нарик и снова попал в заложники.

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Это проблема не языка как такового. Просто преждевременная оптимизация вредна. Здравое количество говнокода вполне может жить в проекте

раскрыть ветку (8)
0
Автор поста оценил этот комментарий

Это проблема не языка как такового.

Может дело и не прям в языке, но в "фандоме", который вокруг него создан. Культ вокруг плюсов, то, зачем он нужен и КАК на нём нужно программировать. И этот культ будет влиять на мышление людей, которые создают Плюсы, т.е. разрабатывают стандарт C++. И получается, что это становится в том числе проблемой языка. Хотя конечно, можно кодить без этих представлений. Если ты можешь не ориентироваться на мнения своих коллег и мнение коммьюнити. Но я мне сложно. Мне важно чужое мнение(

0
Автор поста оценил этот комментарий

Просто преждевременная оптимизация вредна.

Согласен.

Здравое количество говнокода вполне может жить в проекте

Абсолютно согласен))

Но проблема в том, что мне сложно этот говнокод просто оставить как есть. Взять и забить на дублирование. Не знаю, с универа преподы запугали этим или ещё что, но прям бывает не могу себя сдержать. Хоть по рукам бей

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

Конкретно в этом случае я бы вынес все в функцию. Ну а потом понял бы что есть print. Ну и взял бы уже его перегрузку. Эта куча << << << << просто выносит мозг без реальной неоходимости. По мне это имеет место на лабораторках чтоб показать что это не Си, а все-таки С++, но в реальном проекте эти уголки - пиздец. Хотя по работе я больше C#/NodeJS, плюсы использую в ардуинке, стм32 и прочих микриках.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Кучу перегрузок print делать довольно жёстко. В других языках print довольно удобная вещь. Можно написать print("{} la la la {} labuten", a, b); - и кайфуешь. Или в питоне ваще f-строки, просто ляпота. В сишке ток printf, ну либо свой print реализовывать. Но это ещё заморочнее чем то, что я сделал. Угловые скобки это стандартная библиотека. Добавив поддержку этих скобок обеспечивается более лучшая поддержка кода. Не нужно тянуть лишние зависимости. Всё реализовано стандартными средствами. Просто это выглядит монструозно (как по мне).

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Во, точно, слово забыл. Реально монструозно. А вообще нет, cout как и printf стандартные либы, только первая это уже плюсы, а вторая тянется прямо из Си. Но все равно printf("0x%x\n", num); значительно короче и более понятно, хотя это так пока количество выводимых переменных мало.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий
Принтф читается оч неприятно. Эти проценты, \n который заменяется на кроссплатформенный std::endl. Да кода больше писать, но он читабельней и смотрибельней принтфа. Конечно, если ты на си 10 лет жоско без передыху кодил, от плюсов тошнить будет.
раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Пока тебе не понадобится добавить текста до и после переменной. Тогда эта строка может вывалиться за границу экрана и это уже пичалька. Перенести на разные строки конечно можно, но тогда резко падает читаемость. Но тут дело личного вкуса или кодстайла проекта разумеется.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Тогда эта строка может вывалиться за границу экрана и это уже пичалька

это боль, согласен(

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку