{"componentChunkName":"component---src-templates-post-js","path":"/javascript/13-interesnih-momentov-po-stilizacii-koda-ot-google/","result":{"pageContext":{"slug":"13-interesnih-momentov-po-stilizacii-koda-ot-google","content":"\n<p>Для тех кто еще не в курсе, Google выложил&nbsp;<a rel=\"noreferrer noopener\" href=\"https://google.github.io/styleguide/jsguide.html\" target=\"_blank\">стилевое руководство по написанию JavaScript</a>, которое излагает лучшие стилистические практики по написанию ясного и понимаемого кода.</p>\n\n\n\n<p class=\"author\"><a rel=\"noreferrer noopener\" href=\"https://medium.freecodecamp.org/google-publishes-a-javascript-style-guide-here-are-some-key-lessons-1810b8ad050b\" target=\"_blank\"><em>Перевод статьи 13 Noteworthy Points from Google’s JavaScript Style Guide</em></a></p>\n\n\n\n<p id=\"c250\">Там нет строгих правил для написания валидного JavaScript, а есть только советы для написания последовательного и привлекательного кода для всех ваших проектов. Особенно это интересно для JavaScript, который сам по себе гибкий и довольно многообразный язык, позволяющий использовать широкий выбор стилизации кода.</p>\n\n\n\n<p id=\"0e26\">У Google и Airbnb есть два самых популярных стилевых руководства по этой теме. Я определенно советую вам ознакомится с обоими, если вы проводите много времени с JavaScript.</p>\n\n\n\n<p id=\"dc28\">Далее в статье будут тринадцать самых интересных замечаний и релевантных правил из <strong>Google JS Style Guide</strong>.</p>\n\n\n\n<p id=\"b251\">Они покрывают весь спектр работы с кодом, от спорных вопросов до неясных спецификакций, которые удивили даже меня. Конечно же, они изменят суть того, как я буду писать JavaScript в будущем.</p>\n\n\n\n<p id=\"6ead\">Для каждого правила я дам краткое изложение по спецификации, подкрепленное цитатой из стилевого руководства, которое описывает правило в деталях. Где это будет возможно, я покажу пример стиля на практике и сопоставлю его с кодом, который не подходит этому правилу.</p>\n\n\n\n<h2>Используйте пробелы, а не табы (табуляцию)</h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>Кроме символа разграничителя строки, ASCII символ горизонтального пробела (0х20) — единственный символ пробела/разграничителя, который появляется где-либо в исходном файле. Это подразумевает то, что Tab символы не используются для отступов.</em></p></blockquote>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nfunction foo() {\n∙∙∙∙let name;\n}\n\n// плохо\nfunction bar() {\n∙let name;\n}\n\n// хорошо\nfunction baz() {\n∙∙let name;\n}</code></pre>\n\n\n\n<h2><strong>Точки с запятыми необходимы</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Каждое объявление должно заканчиваться на точку с запятой.</p><p>Запрещается полагаться на автоматическую вставку этих символов.</p></blockquote>\n\n\n\n<p id=\"f677\">Хоть я и не могу представить, почему кто-то против этой идеи, но  использование точек с запятыми в JS становится новыми дебатами масштаба ‘spaces versus tabs’.</p>\n\n\n\n<p id=\"6cac\">Google твердо обозначил свою позицию в защиту использования точки с запятой.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nlet luke = {}\nlet leia = {}\n&#91;luke, leia].forEach(jedi => jedi.father = 'vader')\n\n// хорошо\nlet luke = {};\nlet leia = {};\n&#91;luke, leia].forEach((jedi) => {\n  jedi.father = 'vader';\n});</code></pre>\n\n\n\n<h2><strong>Пока что не используйте модули ES6</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Не применяйте модули из ES6, пока что (т.е. слова export и import), так как их семантика пока не не финализирована. Обратите внимание, что это правило будет пересмотрено, после того, как семантика станет полным стандартом.</p></blockquote>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Не делайте пока что такие вещи:\n// — — — lib.js — — —\nexport function square(x) {\n    return x * x\n}\nexport function diag(x, y) {\nreturn sqrt(square(x) + square(y));\n}\n//------ main.js ------\nimport { square, diag } from 'lib';</code></pre>\n\n\n\n<h2><strong>Горизонтальное выравнивание это конечно плохо, но не запрещено</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>Эта практика допустима, но в основном это считается дурным тоном следуя стилю от Google. Не нужно даже продолжать использовать горизонтальные выравнивания в местах, где это уже использовалось.</em></p></blockquote>\n\n\n\n<p>Горизонтальное выравнивание это практика добавления большого количества пробелов в ваш код, чтобы определенные символы появлялись прямо под другими символами на предыдущей строке.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\n{\n    tiny:   42,  \n    longer: 435, \n  };\n  // хорошо\n  {\n    tiny: 42, \n    longer: 435,\n  };</code></pre>\n\n\n\n<h2><strong>Больше не используйте var</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Объявляйте все локальные переменные с помощью const или let. Используйте const по дефолту, пока переменную не надо будет переназначить. Слово var не должно использоваться.</p></blockquote>\n\n\n\n<p>Я до сих пор вижу людей, которые используют слово <code>var</code> в примерах кода. Не могу сказать, есть ли для этого веские причины или это просто дело долгоумерающей привычки.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nvar example = 42;\n// хорошо\nlet example = 42;</code></pre>\n\n\n\n<h2><strong>Стрелочные функции предпочтительнее</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>Стрелочные функции дают краткий синтаксис и решают много сложностей с ним. Предпочитайте стрелочные функции вместо слова function, особенно во вложенных функциях.</em></p></blockquote>\n\n\n\n<p>Буду честен, я просто думал, что стрелочные функции это отлично, потому что они короче и вообще лучше выглядят. Но оказывается, что у них довольно важное предназначение в плане упрощения написания кода.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\n&#91;1, 2, 3].map(function (x) {\n  const y = x + 1;\n  return x * y;\n});\n\n// хорошо\n&#91;1, 2, 3].map((x) => {\n  const y = x + 1;\n  return x * y;\n});</code></pre>\n\n\n\n<h2><strong>Используйте шаблонные строки вместо их объединения</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Используйте шаблонные строки, обозначемые с помощью `, вместо сложного объединнения строк, особенно если есть несколько строчных литералов. К тому же, они могут быть в несколько строк.</p></blockquote>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nfunction sayHi(name) {\n  return 'How are you, ' + name + '?';\n}\n\n// плохо\nfunction sayHi(name) {\n  return &#91;'How are you, ', name, '?'].join();\n}\n\n// плохо\nfunction sayHi(name) {\n  return `How are you, ${ name }?`;\n}\n\n// хорошо\nfunction sayHi(name) {\n  return `How are you, ${name}?`;\n}</code></pre>\n\n\n\n<h2><strong>Не используйте <strong>line continuations</strong> для длинных строк</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Не применяйте line continuations как в обычных строках, так и в шаблонных строках. Пусть даже ES5 позволяет делать это, такой подход может привести с неловким ошибкам, если какой-нибудь пробел будет после слеша и это менее очевидно для читателей.</p></blockquote>\n\n\n\n<p id=\"130e\">Интересен тот момент, что это правило по которому мнения Google и Airbnb расходятся.&nbsp;<a href=\"https://github.com/airbnb/javascript#strings--line-length\" target=\"_blank\" rel=\"noreferrer noopener\">Вот пример Airbnb</a>.</p>\n\n\n\n<p id=\"63fd\">В то время, как Google рекомендует связывать длинные строки, как показано ниже, руководство от Airbnb советует буквально ничего не делать и допускать длинным строкам тянуться сколько хотят.</p>\n\n\n\n<pre class=\"wp-block-code\"><code>// Плохо (Извините, это не показывается как надо на мобильных)\nconst longString = 'This is a very long string that \\\n    far exceeds the 80 column limit. It unfortunately \\\n    contains long stretches of spaces due to how the \\\n    continued lines are indented.';\n// Хорошо\nconst longString = 'This is a very long string that ' + \n    'far exceeds the 80 column limit. It does not contain ' + \n    'long stretches of spaces since the concatenated ' +\n    'strings are cleaner.';</code></pre>\n\n\n\n<h2>“<strong>for… of” предпочтительный тип цикла for</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>В ES6, у языка теперь три разных типа циклов for. Их все можно использовать, хотя for-of циклы должны быть предпочтительнее, если возможно.</em></p></blockquote>\n\n\n\n<p id=\"5e48\">Это странно, если вы спросите меня, но я думаю это надо упомянуть, так как довольно интересно, что Google объявил предпочтительный тип цикла loop.</p>\n\n\n\n<p id=\"aee0\">Я был всегда впечатлен тем, что <code>for…in</code> циклы были лучше для объектов, в то время как <code>for…of </code>были лучше для массивов. В общем правильный инструмент для подходящей ситуации.</p>\n\n\n\n<p id=\"a678\">Пока спецификация Google не противоречит этой идее, до сих пор интересно узнать, почему они сделали предпочтение в сторону этого цикла.</p>\n\n\n\n<h2><strong>Не используйте eval()</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Не используйте eval или Function(…string) конструктор, кроме кодлоадеров. Этот функционал потенциально опасен и просто не работает в CSP среде.</p></blockquote>\n\n\n\n<p>На страничке <code>eval()</code> в MDN, даже есть секция под названием <strong>“Не используйте eval!”</strong></p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nlet obj = { a: 20, b: 30 };\nlet propName = getPropName();  // returns \"a\" or \"b\"\neval( 'var result = obj.' + propName );\n\n// хорошо\nlet obj = { a: 20, b: 30 };\nlet propName = getPropName();  // returns \"a\" or \"b\"\nlet result = obj&#91; propName ];  //  obj&#91; \"a\" ] is the same as obj.a</code></pre>\n\n\n\n<h2><strong>Константы должны именоваться ЗАГЛАВНЫМИ_БУКВАМИ разделенные нижними подчеркиваниями</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Если вы уверены в том, что какие-либо переменные не должны меняться, вы можете указать это написав имя переменной с большой буквы. Это сделает неизменность константы очевидной, как только она начнет использоваться по всему коду.</p></blockquote>\n\n\n\n<p><strong>НО</strong> есть примечательное исключение для этого случая, это константы в функциях. Тут они должны писаться камелКейсом или по-русски горбатым регистром.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Плохо\nconst number = 5;\n// Хорошо\nconst NUMBER = 5;</code></pre>\n\n\n\n<h2><strong>По переменной на объявление</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>Каждая локальная переменная объявляет только одну переменную: такие объявления как let a = 1, b =2 не используются.</em></p></blockquote>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// bad\nlet a = 1, b = 2, c = 3;\n// good\nlet a = 1;\nlet b = 2;\nlet c = 3;</code></pre>\n\n\n\n<h2><strong>Используйте одинарные кавычки, а не двойные</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Обычные строчные литералы заключаются в одинарные кавычки, а не в двойные.</p></blockquote>\n\n\n\n<p>Совет: если строка содержит один символ цитирования, то рассмотрите использование шаблонных строк во избежании выхода из области цитаты.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// плохо\nlet directive = \"No identification of self or mission.\"\n// плохо\nlet saying = \n'Say it ain\\u0027t so.';\n// хорошо\nlet directive = 'No identification of self or mission.';\n// хорошо\nlet saying = `Say it ain't so`;</code></pre>\n\n\n\n<h2 id=\"14e7\"><strong>И напоследок</strong></h2>\n\n\n\n<p id=\"1b21\">Как я и сказал вначале, это не строгие правила. Google это просто один из технологических гигантов и это просто рекомендации.</p>\n\n\n\n<p id=\"6938\">Интересно посмотреть на стиль рекомендаций, которые выкладывают компании, такие как Google, которые нанимают множество блестящих людей, которые тратят непомерно много времени на написание отличного кода.</p>\n\n\n\n<p id=\"b69f\">Вы можете следовать этим правилам, если хотите. Но всегда будут недовольные и вы спокойно можете пренебречь некоторыми или вообще всеми из этих правил.</p>\n\n\n\n<p id=\"4d4d\">Я лично считаю, что есть несколько случаев, в которых спецификации Airbnb более подходящи, чем от Google. Не важно какую позицию вы занимаете по этим конкретным правилам, все ещё важно соблюдать стилистическую последовательность при написании любого кода.</p>\n","type":"js","date":"2020-08-17T14:14:10.000Z","acf":{"seo_desc":"Тринадцать самых интересных замечаний и релевантных правил из Google JS Style Guide","keywords":"Google Style Guide, стилизация кода, правила стилизации кода, код JavaScript","pub_date":"2018-06-14","tags":"JavaScript, JavaScript советы"},"title":"13 интересных моментов по стилизации JavaScript кода от Google","id":"9624dab4-aa17-5129-835c-f320b0ba8e95","excerpt":"<p>Для тех кто еще не в курсе, Google выложил стилевое руководство по написанию JavaScript, которое излагает лучшие стилистические практики по написанию ясного и понимаего кода.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2020/08/DglYtvO7Bn0.jpg"},"interesting":[{"title":"Замыкающие запятые (Trailing Commas) в JavaScript ES 2017","slug":"trailing-commas-v-javascript-es-2017","type":"js"},{"title":"13 интересных моментов по стилизации JavaScript кода от Google","slug":"13-interesnih-momentov-po-stilizacii-koda-ot-google","type":"js"},{"title":"Методы JavaScript, которые улучшат ваши умения за несколько минут","slug":"metody-javascript-kotorie-uluchshat-vashi-umenia-za-neskolko-minut","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}