image

Это перевод поста Майкла МакКи. Майкл — профессиональный программист, который время от времени делится своим опытом и навыками с коллегами, как начинающими кодерами, так и профессионалами.

Большинство программистов в последнюю очередь думают об эстетике кода, который они создают. Конечно, общих правил придерживаются почти все. Но что, если пойти дальше? Хороший код, в первую очередь, должен работать. Но я считаю, что у него должен быть свой стиль, это касается не только содержания, но и формы.

Skillbox рекомендует: Практический годовой курс «PHP-разработчик с нуля до PRO».
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

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

Для меня очень важна организация работы, а также ее визуальная форма. Ruby — отличный вариант языка программирования, как будто специально сделанный, чтобы отвечать моим требованиям, поскольку позволяет делать то, что мы хотим, без всяких проблем. Он гибкий, стильный и логичный.

Давайте рассмотрим этот пример.



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



Уф! Намного лучше. Теперь мы видим, что к чему относится и каким образом. Но и этот код можно улучшить. Декларирование attr_reader и attr_accessor можно сделать еще более выразительным.



Объявление каждого нового атрибута с новой строки гораздо легче воспринимается. Теперь у нас есть список атрибутов, которые присвоены каждому аксессору. Можно пойти и дальше.



Здесь уже легко понять, где есть только возможность чтения, где — и чтения, и записи.

Давайте теперь посмотрим на следующую часть этого класса — метод инициализации. Здесь можно сделать много чего.



В принципе, код читаем, вроде бы все хорошо. Но можно сделать и лучше.



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

Давайте посмотрим, как теперь будет выглядеть InvoiceItem целиком.



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

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



Ох, блин. Здесь в самом начале создается новый репозиторий для хранения классов транзакций. Всего их три, каждый используется для теста, попадания в хеш для более позднего использования. Причем для класса, который мы собираемся создавать, требуется немало атрибутов. Каждый из них имеет довольно длинное имя и значение. Что можно улучшить так, чтобы код выглядел хорошо?

Все просто.



Мы разбили каждый из этих хешей с разрывом строки при каждом новом объявлении значения. Кроме того, использован тот же метод, что и при оптимизации InvoiceTeam. Теперь в редакторе без проблем можно видеть все тестовые данные в довольно узкой области обзора. Мы можем видеть значения ключей. Если нужно, их можно изменить без скроллинга туда-сюда.

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



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



Новый код читаем — и гораздо более human friendly, если так можно выразиться. У нас ясно видны все атрибуты и присваивания. Возможный дебаггинг становится проще. Что-то может пойти не так, и потом выяснять, что и почему не работает, будет сложно, если не привести код к «красивому» виду.

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

Ну и в конце — мой любимый пример для Ruby. Давайте его рассмотрим.



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



Подобный метод работает во многих случаях и я рекомендую его использовать по возможности.

В целом, статью можно назвать тривиальной, но она дает возможность новичку понять красоту кода. То есть сам код должен быть не только рабочим, но еще и понятным — пускай даже в том случае, когда программа пишется только для себя. Если выработать привычку создавать красивый работающий код, это может помочь вашему профессиональному росту.

Skillbox рекомендует:

Комментарии (13)


  1. Arik
    25.09.2018 13:10
    +1

    Сам далек от Руби, но натыкался на такое github.com/rubocop-hq/ruby-style-guide

    По опыту с PHP кодом тоже насмотрелся и навелосипедировал вариантов, после просто начал доверять нормальным редакторам, не знаю как под RubyMine, но под PHPStorm хорошо справляется автоматическое форматирование кода (под Мак Alt+CMD+L)
    image

    причем очень нравится вариант когда форматируется только выделенная область, так в коммитах только твой красивый код)


  1. untilx
    25.09.2018 13:28
    +1

    Возможно, я сейчас выскажу не самое популярное мнение. Вы когда-нибудь пробовали найти что-то в оглавлении старых книг? Ну, тех, в которых название главы выравнено по левому краю, а номер страницы — по правому. Если нет, то попробуйте, если да, то освежите память, а потом подумайте и решите для себя, хорошо выравнивание по колонке оператора присваивания или нет. (К слову, некоторые стайлгайды такой подход явно осуждают.)


    1. robux
      25.09.2018 13:54

      Вот-вот. Такое выравнивание (как в статье) может и выглядит понтово, но с практической точки зрения, если нужно что-то исправить/добавить, приносит много головняка.


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


      Выравнивание ни с того ни с сего с середины экрана (на самом деле из-за эстетических придурей хипстера) здорово сбивает с толку.


      1. rraderio
        25.09.2018 14:05

        Вот-вот. Такое выравнивание (как в статье) может и выглядит понтово, но с практической точки зрения, если нужно что-то исправить/добавить, приносит много головняка.
        А что за проблемы?


        1. robux
          25.09.2018 14:26

          Написал же. Ещё раз.
          Во-первых, проблема в ориентации (блоки посреди экрана сбивают с толку).
          Во-вторых, проблема в быстром редактировании (много пробелов приходится удалять/добавлять при переносе переменных на другую строку, добавлении новых переменных, групповом переименовании по Ctrl+H и так далее).


        1. k4ir05
          26.09.2018 03:55

          Удалить самую длинную строку, добавить строку длиннее самой длинной.

          Видимо, такой подход исповедуют те, кто кому ещё не приходилось править такой код.


          1. rraderio
            26.09.2018 10:10

            Ну так может проблема в IDE?


            1. k4ir05
              26.09.2018 15:23

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


              1. rraderio
                26.09.2018 16:03

                А это разве базовая функция всех «правильных» IDE?
                Будет спрос, будет во всех
                Что может породить лишние конфликты при слиянии.
                git merge -Xignore-space-change


                1. k4ir05
                  27.09.2018 03:34

                  О, для этого ещё и мерджить надо по-особому) И правильно ли я понимаю, что при этом все эти лишние пробелы не перенесутся и канут в небытие?
                  И все эти усложнения только ради для красивости кода с сомнительной читабельностью?


    1. ZaytsevArtem
      27.09.2018 11:42

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

      ещё хуже
      плодить там табы, или
      шёпотом, с особой интонацией, освещая лицо фонариком снизу
      табы и пробелы одновременно.


  1. Fedcomp
    25.09.2018 13:41

    В нормальных проектах часто юзают
    github.com/rubocop-hq/rubocop


  1. wsf
    25.09.2018 14:37

    Статья в стиле «как потратить полчаса на вылизывание 10 строк кода». На правильной расстановке отступов можно остановиться в 90% случаев, а это умеет любой адекватный редактор.