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

На эту тему, безусловно, есть масса статей. Это просто моя попытка выразить на визуальном уровне, как мне вообще нравится организовывать вещи. Я верю, что мы можем найти выражение искусства и дизайна в чем угодно в жизни. Это везде. И несколько вещей для меня важнее продуманной организации и тщательно продуманного стиля. Ruby великолепен, потому что он обычно позволяет нам делать эти вещи так, как мы хотим, и обычно игнорирует наши отступы и использование пробелов. Это дает нам большую гибкость в том, как мы можем делать отступы, стили и использовать немного отличного синтаксического сахара Ruby, чтобы наш код не только хорошо работал, но и отлично смотрелся в редакторе, тратя часы на изучение Это.

Рассмотрим следующий пример:

Даже совсем новые программисты, у которых есть пара строк за плечами, будут знать, что здесь не так. На это почти больно смотреть. Но часто это первый шаг. Умение правильно делать отступы в блоках - ключ к созданию удобочитаемого и красивого кода. Мы можем начать здесь с установки правильного интервала для каждой строки. Соглашение Ruby - это 2 пробела для каждого «гнезда» кода. Вот фиксированный пример:

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

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

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

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

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

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

Теперь давайте посмотрим на весь InvoiceItem класс и посмотрим, как он выглядит.

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

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

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

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

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

И снова мы сталкиваемся с той же проблемой. Мы даже не можем увидеть создание метода целиком! Работа с таким кодом - абсолютная боль. Нам нужно прокрутить нашу область просмотра, чтобы увидеть, какие атрибуты мы присваиваем этому create! методу на User. Давайте исправим это так же, как мы исправили хеши в предыдущем примере.

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

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

Наконец, одна из моих любимых функций Ruby. Рассмотрим следующие строки кода:

Здесь мы берем каждый элемент в animals и применяем к нему метод capitalize. Выглядит прекрасно. Но мы можем немного сократить наш код и сделать его более читабельным для человека.

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

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