![image](https://habrastorage.org/getpro/habr/post_images/9c1/f4c/f22/9c1f4cf227bf427254c84cd607314324.jpg)
Это перевод поста Майкла МакКи. Майкл — профессиональный программист, который время от времени делится своим опытом и навыками с коллегами, как начинающими кодерами, так и профессионалами.
Большинство программистов в последнюю очередь думают об эстетике кода, который они создают. Конечно, общих правил придерживаются почти все. Но что, если пойти дальше? Хороший код, в первую очередь, должен работать. Но я считаю, что у него должен быть свой стиль, это касается не только содержания, но и формы.
Skillbox рекомендует: Практический годовой курс «PHP-разработчик с нуля до PRO».
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».
На самом деле это не так. Вот некоторые проблемы, с которыми сталкиваются все начинающие программисты, которые занимаются самообразованием. Про это есть тонны статей и заметок, но я хочу рассказать, как оформить код визуально так, чтобы он был не только корректным, но и неплохо выглядел со стороны. Я считаю, что самовыражаться можно не только в изобразительном искусстве — это можно делать всегда и везде.
Для меня очень важна организация работы, а также ее визуальная форма. Ruby — отличный вариант языка программирования, как будто специально сделанный, чтобы отвечать моим требованиям, поскольку позволяет делать то, что мы хотим, без всяких проблем. Он гибкий, стильный и логичный.
Давайте рассмотрим этот пример.
![](https://habrastorage.org/getpro/habr/post_images/446/d41/af4/446d41af4402a42a4ecce12d6d46e004.png)
Даже начинающий программист поймет, что здесь не так. На этот код просто больно смотреть. А вот исправленный вариант, который выглядит уже получше.
![](https://habrastorage.org/getpro/habr/post_images/612/2bb/b77/6122bbb7721a5459adc95430c9dbebdf.png)
Уф! Намного лучше. Теперь мы видим, что к чему относится и каким образом. Но и этот код можно улучшить. Декларирование attr_reader и attr_accessor можно сделать еще более выразительным.
![](https://habrastorage.org/getpro/habr/post_images/c73/ec2/07b/c73ec207bcb0655395db307fa6a1ca64.png)
Объявление каждого нового атрибута с новой строки гораздо легче воспринимается. Теперь у нас есть список атрибутов, которые присвоены каждому аксессору. Можно пойти и дальше.
![](https://habrastorage.org/getpro/habr/post_images/fbb/dac/3de/fbbdac3de8f25c5b17a7a017db7ac9f1.png)
Здесь уже легко понять, где есть только возможность чтения, где — и чтения, и записи.
Давайте теперь посмотрим на следующую часть этого класса — метод инициализации. Здесь можно сделать много чего.
![](https://habrastorage.org/getpro/habr/post_images/953/570/c7b/953570c7b234a30606cebc2e3e1a913f.png)
В принципе, код читаем, вроде бы все хорошо. Но можно сделать и лучше.
![](https://habrastorage.org/getpro/habr/post_images/3e1/d2e/e57/3e1d2ee57da93ca7980066e68fe3a290.png)
Если проставить все операторы присваивания в одну колонку, получается весьма неплохо. Глядя на этот код, легко сказать, что, как и почему будет работать.
Давайте посмотрим, как теперь будет выглядеть InvoiceItem целиком.
![](https://habrastorage.org/getpro/habr/post_images/7a2/f80/a99/7a2f80a99dd87f57ae07083d758d8175.png)
Теперь у нас есть класс, который легко читаем и понятен с первого взгляда. Присваивания легко подбираются, аксессоры атрибутов просто использовать.
Какие еще есть возможности оптимизации нашего кода? В большинстве случаев в самом начале изучения программирования написание тестов может вызывать проблемы из-за отсутствия нужных знаний. Время тратится на создание фейковых данных. В этом нет ничего ужасного, но во многих случаях это приводит к созданию больших массивов сложно читаемого текста. Давайте посмотрим вот на это.
![](https://habrastorage.org/getpro/habr/post_images/424/140/4f5/4241404f5191e334630edb5f46b01201.png)
Ох, блин. Здесь в самом начале создается новый репозиторий для хранения классов транзакций. Всего их три, каждый используется для теста, попадания в хеш для более позднего использования. Причем для класса, который мы собираемся создавать, требуется немало атрибутов. Каждый из них имеет довольно длинное имя и значение. Что можно улучшить так, чтобы код выглядел хорошо?
Все просто.
![](https://habrastorage.org/getpro/habr/post_images/32d/0cf/86c/32d0cf86c8bf5a7cb82ecaf52457991a.png)
Мы разбили каждый из этих хешей с разрывом строки при каждом новом объявлении значения. Кроме того, использован тот же метод, что и при оптимизации InvoiceTeam. Теперь в редакторе без проблем можно видеть все тестовые данные в довольно узкой области обзора. Мы можем видеть значения ключей. Если нужно, их можно изменить без скроллинга туда-сюда.
Аналогичную стратегию можно использовать, когда мы работаем с большим количеством атрибутов.
![](https://habrastorage.org/getpro/habr/post_images/471/fb2/1b7/471fb21b7437ac63c2409dbd1846a382.png)
В этом случае мы не видим всей структуры кода, по крайней мере, в текущей области просмотра. Для того, чтобы увидеть атрибуты, нужно постоянно скролить, что не слишком удобно. Давайте исправим это так же, как мы уже сделали выше, в примере с хешами.
![](https://habrastorage.org/getpro/habr/post_images/a40/7bd/2d0/a407bd2d08d40d826edd4fd5f59dbcaf.png)
Новый код читаем — и гораздо более human friendly, если так можно выразиться. У нас ясно видны все атрибуты и присваивания. Возможный дебаггинг становится проще. Что-то может пойти не так, и потом выяснять, что и почему не работает, будет сложно, если не привести код к «красивому» виду.
Когда мы пишем программы, нельзя забывать: важно не только то, чтобы они работали корректно, но еще и то, чтобы принцип их функционирования был понятен коллегам, если это потребуется. Код должен быть логичным, разбитым на абзацы, предложения и структурные разделы.
Ну и в конце — мой любимый пример для Ruby. Давайте его рассмотрим.
![](https://habrastorage.org/getpro/habr/post_images/ed1/1bd/2a6/ed11bd2a627b583e2e160d6a818ab42d.png)
Давайте возьмем каждый элемент из animals и применим метод capitalize. Это выглядит неплохо, но еще лучше то, что код можно немного сократить и сделать его более читаемым для человека.
![](https://habrastorage.org/getpro/habr/post_images/04d/ed6/410/04ded6410e5c7f542b04e2fad9699f16.png)
Подобный метод работает во многих случаях и я рекомендую его использовать по возможности.
В целом, статью можно назвать тривиальной, но она дает возможность новичку понять красоту кода. То есть сам код должен быть не только рабочим, но еще и понятным — пускай даже в том случае, когда программа пишется только для себя. Если выработать привычку создавать красивый работающий код, это может помочь вашему профессиональному росту.
Skillbox рекомендует:
- Онлайн-курс «Профессия Frontend-разработчик».
- Образовательный онлайн-курс «Профессия веб-разработчик».
- Практический курс «Мобильный разработчик PRO».
Комментарии (13)
untilx
25.09.2018 13:28+1Возможно, я сейчас выскажу не самое популярное мнение. Вы когда-нибудь пробовали найти что-то в оглавлении старых книг? Ну, тех, в которых название главы выравнено по левому краю, а номер страницы — по правому. Если нет, то попробуйте, если да, то освежите память, а потом подумайте и решите для себя, хорошо выравнивание по колонке оператора присваивания или нет. (К слову, некоторые стайлгайды такой подход явно осуждают.)
robux
25.09.2018 13:54Вот-вот. Такое выравнивание (как в статье) может и выглядит понтово, но с практической точки зрения, если нужно что-то исправить/добавить, приносит много головняка.
Я и сам раньше так чудил, а сейчас делаю отступы по 2 пробела на блок, так и удобнее кодить и нагляднее, когда пытаешься через год даже в своем коде разобраться, не говоря о чужом.
Выравнивание ни с того ни с сего с середины экрана (на самом деле из-за эстетических придурей хипстера) здорово сбивает с толку.
rraderio
25.09.2018 14:05Вот-вот. Такое выравнивание (как в статье) может и выглядит понтово, но с практической точки зрения, если нужно что-то исправить/добавить, приносит много головняка.
А что за проблемы?robux
25.09.2018 14:26Написал же. Ещё раз.
Во-первых, проблема в ориентации (блоки посреди экрана сбивают с толку).
Во-вторых, проблема в быстром редактировании (много пробелов приходится удалять/добавлять при переносе переменных на другую строку, добавлении новых переменных, групповом переименовании по Ctrl+H и так далее).
k4ir05
26.09.2018 03:55Удалить самую длинную строку, добавить строку длиннее самой длинной.
Видимо, такой подход исповедуют те, кто кому ещё не приходилось править такой код.rraderio
26.09.2018 10:10Ну так может проблема в IDE?
k4ir05
26.09.2018 15:23А это разве базовая функция всех «правильных» IDE?
А проблема тут (помимо читабельности) ещё в том, что при добавлении или удалении одного выражения придётся править и другие выражения, которые не имеют никакого отношения к выполняемой задаче. Что может породить лишние конфликты при слиянии.rraderio
26.09.2018 16:03А это разве базовая функция всех «правильных» IDE?
Будет спрос, будет во всех
Что может породить лишние конфликты при слиянии.
git merge -Xignore-space-changek4ir05
27.09.2018 03:34О, для этого ещё и мерджить надо по-особому) И правильно ли я понимаю, что при этом все эти лишние пробелы не перенесутся и канут в небытие?
И все эти усложнения только ради для красивости кода с сомнительной читабельностью?
ZaytsevArtem
27.09.2018 11:42Я прямо представляю в голове, как бывший рубист или ещё кто-то привык городить кучу пробелов, допустим, мы его обратили в табы, а он нашёл лазейку и продолжает плодить пробелы в элайнмент, или
ещё хужеплодить там табы, илишёпотом, с особой интонацией, освещая лицо фонариком снизутабы и пробелы одновременно.wsf
25.09.2018 14:37Статья в стиле «как потратить полчаса на вылизывание 10 строк кода». На правильной расстановке отступов можно остановиться в 90% случаев, а это умеет любой адекватный редактор.
Arik
Сам далек от Руби, но натыкался на такое github.com/rubocop-hq/ruby-style-guide
![image](https://habrastorage.org/webt/th/1d/-g/th1d-gs2p5h7s3mjd3cjcalzt9o.gif)
По опыту с PHP кодом тоже насмотрелся и навелосипедировал вариантов, после просто начал доверять нормальным редакторам, не знаю как под RubyMine, но под PHPStorm хорошо справляется автоматическое форматирование кода (под Мак Alt+CMD+L)
причем очень нравится вариант когда форматируется только выделенная область, так в коммитах только твой красивый код)