# Советы по стилю кода Код должен быть максимально читаемым и понятным. Для этого нужен *хороший стиль* написания кода. В этой главе мы рассмотрим компоненты такого стиля. [cut] ## Синтаксис Шпаргалка с правилами синтаксиса: Разберём основные моменты. ### Фигурные скобки Пишутся на той же строке, так называемый "египетский" стиль. Перед скобкой -- пробел. Если у вас уже есть опыт в разработке и вы привыкли делать скобку на отдельной строке -- это тоже вариант. В конце концов, решать вам. Но в основных JavaScript-фреймворках (jQuery, Dojo, Google Closure Library, Mootools, Ext.JS, YUI...) стиль именно такой. Если условие и код достаточно короткие, например `if (cond) return null;`, то запись в одну строку вполне читаема... Но, как правило, отдельная строка всё равно воспринимается лучше. ### Длина строки Максимальную длину строки согласовывают в команде. Как правило, это либо `80`, либо `120` символов, в зависимости от того, какие мониторы у разработчиков. Более длинные строки необходимо разбивать. Если этого не сделать, то перевод очень длинной строки сделает редактор, и это может быть менее красиво и читаемо. ### Отступы Отступы нужны двух типов: ### Точка с запятой Точки с запятой нужно ставить, даже если их, казалось бы, можно пропустить. Есть языки, в которых точка с запятой не обязательна, и её там никто не ставит. В JavaScript она тоже не обязательна, но ставить нужно. В чём же разница? Она в том, что **в JavaScript без точки с запятой возможны трудноуловимые ошибки.** С некоторыми примерами вы встретитесь дальше в учебнике. Такая вот особенность синтаксиса. И поэтому рекомендуется её всегда ставить. ## Именование Общее правило: Для имён используется английский язык (не транслит) и верблюжья нотация. Более подробно -- читайте про [имена функций](#function-naming) и [имена переменных](#variable-naming). ## Уровни вложенности **Уровней вложенности должно быть немного.** Например, [проверки в циклах лучше делать через "continue"](#continue), чтобы не было дополнительного уровня `if(..) { ... }`: Вместо: ```js for (var i=0; i<10; i++) { if (i подходит) { ... // <- уровень вложенности 2 } } ``` Используйте: ```js for (var i=0; i<10; i++) { if (i *!*не*/!* подходит) *!*continue*/!*; ... // <- уровень вложенности 1 } ``` Аналогичная ситуация -- с `if/else` и `return`. Следующие две конструкции идентичны. Первая: ```js function isEven(n) { // проверка чётности if (n % 2 == 0) { return true; *!* } else { return false; } */!* } ``` Вторая: ```js function isEven(n) { // проверка чётности if (n % 2 == 0) { return true; } *!* return false; */!* } ``` Если в блоке `if` идёт `return`, то `else` за ним не нужен. **Лучше быстро обработать простые случаи, вернуть результат, а дальше разбираться со сложным, без дополнительного уровня вложенности.** В случае с функцией `isEven` можно было бы поступить и проще: ```js function isEven(n) { // проверка чётности return n % 2 == 0; } ``` ..Казалось бы, можно пойти дальше, есть ещё более короткий вариант: ```js function isEven(n) { // проверка чётности return !(n % 2); } ``` ...Однако, код `!(n % 2)` менее очевиден чем `n % 2 == 0`. Поэтому, на самом деле, последний вариант хуже. **Главное для нас -- не краткость кода, а его простота и читаемость.** ## Функции = Комментарии **Функции должны быть небольшими.** Если функция большая -- желательно разбить её на несколько. Этому правилу бывает сложно следовать, но оно стоит того. При чем же здесь комментарии? Вызов отдельной небольшой функции не только легче отлаживать и тестировать -- сам факт его наличия является *отличным комментарием*. Сравните, например, две функции `showPrimes(n)` для вывода простых чисел до `n`. Первый вариант: ```js function showPrimes(n) { nextPrime: for (var i=2; i
  • Функции над кодом, который их использует: ```js // *!*объявить функции*/!* function createElement() { ... } function setHandler(elem) { ... } function walkAround() { ... } // *!*код, использующий функции*/!* var elem = createElement(); setHandler(elem); walkAround(); ```
  • Сначала код, а функции внизу: ```js // *!*код, использующий функции*/!* var elem = createElement(); setHandler(elem); walkAround(); // --- *!*функции*/!* --- function createElement() { ... } function setHandler(elem) { ... } function walkAround() { ... } ```
  • ...На самом деле существует еще третий "стиль", при котором функции хаотично разбросаны по коду ;), но это ведь не наш метод, да? **Как правило, лучше располагать функции под кодом, который их использует.** То есть, это 2й способ. Дело в том, что при чтении такого кода мы хотим знать в первую очередь, *что он делает*, а уже затем *какие функции ему помогают.* Если первым идёт код, то это как раз дает необходимую информацию. Что же касается функций, то вполне возможно нам и не понадобится их читать, особенно если они названы адекватно и то, что они делают, понятно. У первого способа, впрочем, есть то преимущество, что на момент чтения мы уже знаем, какие функции существуют. Таким образом, если над названиями функций никто не думает -- может быть, это будет лучшим выбором :). Попробуйте оба варианта, но по моей практике предпочтителен всё же второй. ## Комментарии В коде нужны комментарии. **Как правило, комментарии отвечают на вопрос "что происходит в коде?"** Например: **...Но куда более важными могут быть комментарии, которые объясняют не *что*, а *почему* в коде происходит именно это!** Как правило, из кода можно понять, что он делает. Бывает, конечно, всякое, но, в конце концов, вы этот код *видите*. Однако гораздо важнее может быть то, чего вы *не видите*! *Почему* это сделано именно так? На это сам код ответа не даёт. Например: Один из показателей хорошего разработчика -- качество комментариев, которые позволяют эффективно поддерживать код, возвращаться к нему после любой паузы и легко вносить изменения. ## Руководства по стилю Когда написанием проекта занимается целая команда, то должен существовать один стандарт кода, описывающий где и когда ставить пробелы, запятые, переносы строк и т.п. Сейчас, когда есть столько готовых проектов, нет смысла придумывать целиком своё руководство по стилю. Можно взять уже готовое, и которому, по желанию, всегда можно что-то добавить. Большинство есть на английском, сообщите мне, если найдёте хороший перевод: Для того, чтобы начать разработку, вполне хватит элементов стилей, обозначенных в этой главе. В дальнейшем, посмотрите на эти руководства, найдите "свой" стиль ;) ### Автоматизированные средства проверки Существуют онлайн-сервисы, проверяющие стиль кода. Самые известные -- это: Все они также доступны в виде программ, которые можно скачать. ## Итого Описанные принципы оформления кода уместны в большинстве проектов. Есть и другие полезные соглашения. Следуя (или не следуя) им, необходимо помнить, что любые советы по стилю хороши лишь тогда, когда делают код читаемее, понятнее, проще в поддержке.