Как стать автором
Обновить

Что такое красивый код и как научиться его писать

Время на прочтение9 мин
Количество просмотров23K
Всего голосов 45: ↑40 и ↓5+35
Комментарии39

Комментарии 39

Почему?
> Яндекс
> С++
> МАША

Вот если бы автора звали Брайан, Деннис, Бьярне, или, на худой конец, хотя бы Герберт…
НЛО прилетело и опубликовало эту надпись здесь

Тред не читай — сразу отвечай!

Хорошая статья для начинающих. Спасибо за плагин!
Почему-то само выражение "красивый код" коробит, выглядит очень субъективным. Хотя адекватную альтернативу предложить не могу.

Есть хороший термин — clean code.
Собственно "там" никто не скажет nice\pretty\beautiful code.

Познакомился с темой clean code в англоязычной литературе и чтобы сохранить фонетику аббревиатуры начал мысленно переводить как красивый код (Клин Код -> Красивый Код).
Но потом в русском языке clean code превратилось в чистая архитектура, и теперь термин "красивый код" трудно защищать, так как выглядит субъективно, а апеллировать к авторитетным источникам нельзя.


Внутренне обрадовался, что кто-то ещё использует такой термин. Но статья про clean code.

"Оставляйте время для рефакторинга" — обычно это заканчивается на очередной планерке… Да, надо бы (перечень правильных работ)… А после начинается очередная итерация "надр сделать еще вчера"…
Какой там ревью и прочий девопс… Фигачим на прод

Приходилось работать в конторе, где начальник насаждал линию «тратим рабочее время только на то, что приносит ценность клиенту, т.е. на работу, результаты которой он видит. А рефакторингом можете заниматься в свободное время». Хорошо ещё, что за баги не штрафовали, но думаю, это только вопрос времени
Честно говоря не нашел ценной информации, очень слабенькая статья.
Нет акцентов на типичных недостатках. Пока не прочитаешь разъяснения автора к приведенному коду — не понимаешь на что обратить внимание, почему этот код «вонюч». По идее наоборот сначала перечисляются типичные упущения, а затем предлагается пример для демонстрации.
Или вот взять пример функции IsOKPressed. С этим примером всё в целом неплохо, кроме того, что функция IsOKPressed имеет побочный эффект. Это какая-то местечковая функция, об особенностях которой должен догадываться читатель?
Несвоевременный вызов может привести к тому, что действия, которые необходимо сделать до показа нового экрана пользователю, сделаны не будут.
Ну и ряд прочих моментов.
Спасибо автору за попытку, но над структурой подачи надо поработать.
Красота кода и С++? серьёзно?
вы вообще пробовали изучать другие языки?
Ведь наш Цезарь — он прекрасен.
Да, он не какая-нибудь красота, не
просто красота, это — сама красота в апогее!

/Астерикс на Олимпийских играх/

Языки изучают не за красоту, а ради применения в качестве рабочего инструмента. А красота — понятие субъективное. Особенно среди высших приматов.
а что из тезисов статьи не применимо к другим языкам?

Какие проблемы конкретно с С++ вы видите?

Напишите пожалуйста что делать если 90% проекта состоит из стороннего опенсорсного «вонючего кода»?
Надо ли его рефакторить и если да, то как потом его апгрейдить из тех же сторонних источников.
А если нет, то как вы боретесь с когнитивным диссонансом, когда в вашем проекте столько «вонючего кода»?
я сейчас на таком проекте. он достался нам по наследству от другой компании.
поэтому я не буду задавать риторические вопросы из серии «зачем вы используете такой код». вероятно, это не ваше решение и не ваша ответственность. и может быть в момент принятия этого решения, оно было верным в тех условиях.
я не думаю, что рефакторить внутри своего проекта чужой код, который вы берете из обновляемого опен сорса, — хорошая идея. опять же, если мы про «сферического коня», то можно вложится и порефакторить их опен сорс, делать пулл реквесты и прочее. но я так понимаю, что это тоже маловероятно. только если на досуге.
то, что делаем мы, это просто стараемся писать нормальный код в той части проекта, за которую отвечаем мы. изолируем чужой код, как можем, и стараемся туда не лезть.
Можно ещё попробовать скрыть такой чужой код за своим «красивым» фасадом или абстракцией.
я не буду задавать риторические вопросы из серии «зачем вы используете такой код». вероятно, это не ваше решение

Ну это просто данность. Скажем BSP от производителя с его же SDK.
В книгах так хорошо пишут о том как избегать цикломатичности, но что-то умалчивается о проклятии макросов.
Тексты BSP наводнены макросами условной компиляции чтобы быть портируемыми под все семейство чипов производителя или под 3-4 е типа сред разработки. Мусор макросов (поскольку это вставки не относящиеся ни к проекту, ни к целевому чипу) загромождает поле зрения, не дает понять логику, утомляет.
И это точно никто не собирается исправлять или делать «красивее»
Огромные HAL-ы, именования в которых никак не коррелирует с именованиям в мануалах на чипы. Вынуждающие делать двойную работу по изучению платформы разработки.
Или вот в последнее время началось применение текстов автосгенерированных в Matlab-Simulink-Stateflow. Там цикломатичность в принципе не соблюдается никак.
По моему битва за «красоту» уже проиграна. Что толку если только 10% текстов будут красивыми?

Я работаю с HAL-файлами. и да, это ад. Там и goto, и что угодно. Но мы же говорим про код приложения, а не код библиотек. Тем более, что те библиотеки, о которых мы сейчас — это очень специфическая история. Часто и те примеры, которые дают производители чипов, не работают или даже не компилируются под заявленные платформы и борды. Ну что поделаешь. Я всё равно предпочту писать код аккуратно.
Как новичку в целом было интересно, но критически не хватает конкретики в примерах с вонючим кодом. Показан код, а куда смотреть, чего избегать, на что плеваться — лишь собственные догадки. Хотелось бы, чтобы сам автор выразил своё мнение по этому поводу. Ну и в целом после прочтения ощущение, будто затронули тему, и так не раскрыли, или раскрыли очень мало. За ссылки на ресурсы и книги — спасибо)
Спасибо за обратную связь! Куда смотреть и чего избегать — это как раз на сайте рефакторинг.гуру или в «Чистом коде» у Мартина. Там огромный мир рефакторинга и примеров «плохой vs хороший». Статья в первую очередь о том, что красота разная, или «разноуровневая» что ли, и для каждого уровня свои инструменты и подходы. За большей конкретикой нужно в каждую тему отдельно погрузится. Я буду рада, если эта статья хотя бы как-то помогла или направила в сторону знакомства с той или иной темой ближе.
Ну, если рассматривать статью с точки зрения «показать где копать» — тогда вопросов нет. Спасибо за полезные ресурсы!
Для себя считаю проблемой то, что там, где есть налаженный курс, там учат старым плюсам. Знаете, как тот самый известный MIT курс с Питоном, который однажды для второго Питона записали, так долгое время и не переделывали.
У вас какой язык используется С++17?
да. С++17. мы перерабатываем курс, который был написан для С++11, убираем неактуальное, дописываем обновлённое. когда будет финально закончен вариант для С++17, мы планируем сделать следующую итерацию по улучшениям и поднять версию до 20.
Если не секрет, переписываете в той же ветке проект или отдельную создаете?
А вот если у вас в коде комментарий к каждой строке, без которого непонятно, что происходит — это повод задуматься.

Я, как человек, унаследовавший многие тонны дремучего легаси могу сказать, что меня совершенно не интересует, что вот именно вот здесь происходит — это я уж как-нибудь разберусь. А вот зачем это происходит — иной раз неподвластно в принципе, и какая бизнес-логика (и бизнес ли) сюда привела — не знает никто. И на разматывание вот этого всего уходит куда больше времени, чем на понимание «что здесь происходит без комментариев».

Это не просто легаси, это еще и хреново написанный код. Сам поддерживал огромную кодовую базу, насмотрелся на эти потайные ходы и граблями и наскальными рисунками описывающими как это работает.


Всегда одни проблемы:


Нужен рефакторинг, но нет никакой возможности покрыть тестами код (иногда даже технической), и выделить ресурсы под этот рефакторинг, потому что нет средств.


И второе, это команда. Если этот код написала текущая команда, без изменения состава команды чтобы поднять экспертизу почти нет шансов это выправить, потому что получится в очередной раз ботва, а не код.


Поэтому часто требуются значительные меры чтобы оживить проект, но лидам страшно этим заниматься (тесты, управление, рефакторинг, риски, прочее), и это третья проблема, которая делает код еще больше легаси, и бородой.


Вобщем, замкнутый круг, который надо разрывать, но делают это совсем немногие.

Знали бы вы, как я вас понимаю.

Я всегда такой совет даю:


Код это книга. Если вы не можете её прочитать, не понимаете её, или ломаете язык при чтении, значит есть проблемы.


Ребята пишут по-разному. У первых архитектура страдает, у вторых кодирование, у третьих наименования, у четвертых всего понемногу, и этот совет выше, вероятно, помогает во многих случаях.

краткость — сестра таланта. Теперь знаю, как говорить коллегам про их код. Беру на вооружение.

Code smells обычно переводят мягче, например как "код с душком".

gutovsky, поздравляю с выпуском первой статьи.
Мартина теперь точно прочитаю. От себя лично порекомендовал бы использовать кодогенераторы в своей работе. Они здорово облегчают жизнь и помогают выстроить красивую архитектуру.
спасибо большое!
о каких кодогенераторах идёт речь?
кодогенераторы из UML. Все связи и сущности видно сразу. Можно понять, какой класс стал «раздувальщиком», где у класса очень много обязанностей. В общем полная ОО-структура. Там уже грех выстроить «кривую» архитектуру. Да и моделирование диаграммы приводит мысли в порядок. Помимо того учишься у самого генератора таким вещам, как разделение объявления и реализации, если говорить про вышеупомянутые С++.
Если вопрос про конкретный софт, то лично мне по душе SAP PowerDesigner. Там, конечно, много ограничений накладывается, но для описания своей ни на чем не завязанной библиотеки вполне приличное решение.
Если совсем базово, то можно выделить три уровня красоты кода:

И ни один из них к красивому коду никакого отношения не имеет. Замечательно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий