Code Style (in russian)

Mikhail Davydov
Mikhail DavydovJavaScript & Node.js Developer at Yandex
Code Style (in russian)
Михаил Давыдов
Разработчик JavaScript
Code Style
В ролях
- разработчик А
- разработчик Б (новичек)
История про разработчиков
4
Эта история вымышленная
и к Яндексу не относится
Жил-был один разработчик
и писал вот так:
6
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
7
В проект пришел еще один и
стал писать так:
8
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
9
И общего Code Style у них
не было…
10
11
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
А: Что за говнокод?
12
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
Б: У самого говнокод!
13
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
А: Почему так ф-ю
написал?
14
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
Б: А ты вообще табы
используешь!
15
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
А: Зачем тут скобка?
16
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
Б: Уайтсмитс? Ты из
какой пещеры вылез?
17
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
А: Зачем тут точка с
запятой?
18
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
Б: А ты зачем перенос
не поставил?
19
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Код разработчика Б
А: RTFM or GTFO!
20
function name(value)
-tab->{
-tab->-tab->var a = 0, b = 42;
-tab->-tab->if (value) return a
-tab->}
Код разработчика А
Б: А в бубен?
21
22
Нужна договоренность в
стиле кода
23
Организационный профит Code Style
•  Это закон
–  Должна быть отдельная страница о которой все знают
–  Страницу просто найти
•  Закон разрешает конфликты
–  Не знание закона не освобождает от ответственности
•  Решает большинство проблем
•  Эту страницу нужно дать прочитать перед
началом работы
24
Если не понятно, то нужно
дать понять причину ввода
такого Code Style
Применение CS
Для быстрого восприятия кода
Для предотвращения ошибок в коде
Для быстрого написания кода
26
Каждый из следующих
примеров зависит от
восприятия конкретного
человека
Обобщение элементов
28
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Обобщение соседних элементов
29
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Обобщение соседних элементов
Перенос строки разрывает обобщение
30
.b-form {
font-family: Arial;
font-size: 2em;
padding: 0 10px;
min-height: 100px;
}
Обобщение соседних элементов
Перенос строки разделяет разные типы CSS
ствойств и обобщает соседние элементы
Вертикаль – список
32
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Вертикаль – список
var - список переменных
33
var name = function (value) {
..var a = 0
...., b = 42
...., c = 42
...., d = 42
....;
};
Вертикаль – список
Coma-first style – его цель уменьшить число
ошибок.
34
var name = function (value) {
..var a = 0
...., b = 42
....c = 42
...., d = 42
....;
};
Вертикаль – список
Отсутствие запятых легко заметить
35
var a =
..{ b: 2
.., c: 3
.., d: 4
..}
..;
Вертикаль – список
Coma-first style для литералов Object
https://gist.github.com/357981
36
ALL code is ugly.
Yours, mine, everyone's.
Code Is Ugly. Just face it.
37
.b-form {
-webkit-transition: color;
-moz-transition: color;
-ms-transition: color;
-o-transition: color;
transition: color;
}
Вертикаль – список
Выравнивание по свойству
38
.b-form {
-webkit-transition: color;
-moz-transition: color;
-ms-transition: color;
-o-transition: color;
transition: color;
}
Вертикаль – список
Выравнивание по значению
Так проще прочитать
39
<ol class="b-list">
....<li class="b-item">Abc</li>
....<li class="b-item">Abc</li>
....<li class="b-item">Abc</li>
</ol>
Вертикаль – список
40
jQuery('.clickable')
.....filter('a')
.....click(handler)
.....end()
.....show('slow')
....;
Вертикаль – список
Вызов функций по цепочке – список
41
if (typeof a !== "undefined" &&
typeof b !== "undefined" &&
typeof c === "string") {
// your stuff
}
Вертикаль – список
Несколько условий – список
Единообразие
43
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Единообразие
Похожий код быстрее воспринять
44
// Этот пробел обязательный
function A(value) {
}
// Этот пробел для единообразия
var A = function (value) {
};
Единообразие
Похожий код быстрее воспринять
Разрядка
46
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Разрядка
БуряМглоюНебоКроет vs
Буря мглою небо кроет
47
for ( var i = 0 ; i < 100 ; i++ ){
}
for (var i = 0; i < 100; i++){
}
Разрядка, но без фанатизма
Буря Мглою Небо Кроет vs
Буря мглою небо кроет
48
Сильно разряженный код
сложно воспринять
49
<div class="b-header"></div>
Однако не везде она работает
В HTML перед и после равно пробел как
правило не ставят
Начало - конец
51
var name = function (value) {
....var a = 0,
........b = 42;
if (value) {
....return a;
}
};
Начало блока "видит" конец блока
Код представляет из себя "параграфы
текста"
52
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Начало блока "видит" конец блока
Код представляет из себя "параграфы
текста"
53
<div class="b-header">
....<div class="b-item">Abc</div>
....<div class="b-item">Abc</div>
....<div class="b-item">Abc</div>
</div>
Начало блока "видит" конец блока
54
<div class="b-header">
....<div class="b-item">
........Abc
....</div>
....<div class="b-item">
........Abc
....</div>
</div>
Начало блока "видит" конец блока
Не везде это применимо: много писать,
мельтешение, баги с пробелами
Предотвращение ошибок
56
<div class="b-header">
....<div class="b-item">
........Abc
....</div>
....<div class="b-item">
........Abc
....</div>
</div>
Лишние пробелы
Переносы и пробел = +2 лишних пробельных
символа
57
Лишние пробелы
Переносы и пробел = +2 лишних пробельных
символа
var item = $('.b-item')[0];
if (item.innerHTML = "Abc") {
// Недостижим
}
Точка с запятой в FE
59
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
}
Точка с запятой в Function Expression
60
cat **/*.js > all.js!
61
var name = function (value) {
}var name2 = function (value) {
}
Точка с запятой в Function Expression
SyntaxError: missing ; before statement
62
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return a;
....}
};
Точка с запятой в Function Expression
Скобки у циклов
64
var name = function (value) {
....var a = 0,
........b = 42;
....if (value)
........return a;
};
Скобки у циклов и условий
Лень писать скобки
65
var name = function (value) {
....var a = 0,
........b = 42;
....if (value)
........a = 42;
........return a;
};
Скобки у циклов и условий
Редкая логическая ошибка
66
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........a = 42;
........return a;
....}
};
Скобки у циклов и условий
67
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) return a;
};
Скобки у циклов и условий
Много скобок создает много шума
Auto semicolon insertion
69
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return
............{pewpew: a};
....}
};
Auto semicolon insertion
70
var name = function (value) {
....var a = 0,
........b = 42;
....if (value) {
........return;
............{pewpew: a};
....}
};
Auto semicolon insertion
После return будет поставлена ;
http://es5.github.com/#x7.9
Последнее свойство перекрывает
предшествующее
Свойства с префиксами в CSS
72
.b-form {
box-shadow: 0 0 400px 200px #000;
-webkit-box-shadow: 0 0 400px 200px #000;
}
Свойства с префиксами в CSS
73
Свойства с префиксами в CSS
74
.b-form {
-webkit-box-shadow: 0 0 400px 200px #000;
box-shadow: 0 0 400px 200px #000;
}
Свойства с префиксами в CSS
Последним должен идти свойство без
префикса
http://pepelsbey.net/pres/pre-fixes/
75
Свойства с префиксами в CSS
76
Еще несколько слов…
•  Документирование неявного кода
–  Код должен быть максимально самодокументируемым
•  Написание примеров использования
–  Чтобы не рыться в коде
•  Сокращение длины строки
–  Чтобы не вертеть головой и не скролить
•  Уменьшение уровней вложенности
–  Быстрее читать код
•  Единообразие в модулях и именах
•  Автоматизированная проверка кода ♥
–  IDE
–  Pre Commit Hook
77
Код должен выглядеть так
как будто его пишет один
человек
78
А как в Яндексе?
79
Как мы делаем в Яндексе
•  Love & Peace
•  У каждого проекта свой Code Style
–  Страница в Вики
–  Или CONTRIBUTE.md файл в корне проекта
•  Есть стиль по умолчанию
–  Страница в Вики со стилей по языкам
–  Не обязательный – на случай если лень
•  Стараемся использовать общепринятый
–  Так проще новым разработчикам
–  Привычней читать сторонний код
•  Code Review
–  Зависит от размера проекта
–  Как правило новички проходят обязательно
80
Заключение
•  Соглашение Code Style - Must have!
•  Нужно знать меру
–  Разрядка пробелами
–  Фигурные скобки
•  Все правила имеют на то причину
81
82
Михаил Давыдов
Разработчик JavaScript
azproduction@yandex-team.ru
azproduction
Спасибо
1 of 82

Recommended

Михаил Давыдов — Code Style by
Михаил Давыдов — Code StyleМихаил Давыдов — Code Style
Михаил Давыдов — Code StyleYandex
4.4K views82 slides
Как за час сделать недельную работу by
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работуcorehard_by
760 views63 slides
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr... by
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Ontico
1.1K views111 slides
Андрей Карпов, Приватные байки от разработчиков анализатора кода by
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
838 views49 slides
Основы доменной модели by
Основы доменной моделиОсновы доменной модели
Основы доменной моделиАнтон Шабовта
3.8K views31 slides
TypeScript: особенности разработки / Александр Майоров (Tutu.ru) by
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
1.9K views61 slides

More Related Content

Viewers also liked

How to install git on ubuntu by
How to install git on ubuntuHow to install git on ubuntu
How to install git on ubuntubaran19901990
426 views8 slides
Modules and assembling of JavaScript (in russian) by
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Mikhail Davydov
966 views54 slides
07 control+structures by
07 control+structures07 control+structures
07 control+structuresbaran19901990
809 views37 slides
JavaScript. Async (in Russian) by
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)Mikhail Davydov
688 views36 slides
Ajax and Transports (in russian) by
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)Mikhail Davydov
570 views31 slides
Dump-IT Загрузка и инициализация JavaScript by
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptMikhail Davydov
730 views30 slides

Viewers also liked(8)

How to install git on ubuntu by baran19901990
How to install git on ubuntuHow to install git on ubuntu
How to install git on ubuntu
baran19901990426 views
Modules and assembling of JavaScript (in russian) by Mikhail Davydov
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
Mikhail Davydov966 views
Ajax and Transports (in russian) by Mikhail Davydov
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)
Mikhail Davydov570 views
Dump-IT Загрузка и инициализация JavaScript by Mikhail Davydov
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov730 views
JavaScript. Loops and functions (in russian) by Mikhail Davydov
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
Mikhail Davydov680 views
Introduction in Node.js (in russian) by Mikhail Davydov
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
Mikhail Davydov1.5K views

Similar to Code Style (in russian)

CSSO — минимизируем CSS by
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSSRoman Dvornov
2.7K views149 slides
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса" by
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Yandex
2.1K views190 slides
Цена ошибки by
Цена ошибкиЦена ошибки
Цена ошибкиPlatonov Sergey
906 views32 slides
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека... by
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...Yandex
1.8K views242 slides
Парсим CSS by
Парсим CSSПарсим CSS
Парсим CSSRoman Dvornov
1.7K views86 slides
Moscow js 26 webpack by
Moscow js 26   webpackMoscow js 26   webpack
Moscow js 26 webpacklgordey
465 views41 slides

Similar to Code Style (in russian)(20)

CSSO — минимизируем CSS by Roman Dvornov
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSS
Roman Dvornov2.7K views
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса" by Yandex
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Yandex2.1K views
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека... by Yandex
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Yandex1.8K views
Moscow js 26 webpack by lgordey
Moscow js 26   webpackMoscow js 26   webpack
Moscow js 26 webpack
lgordey465 views
MoscowJS 26 webpack presentation by lgordey
MoscowJS 26 webpack presentationMoscowJS 26 webpack presentation
MoscowJS 26 webpack presentation
lgordey323 views
Владимир Варанкин — «БЭМ» by Yandex
Владимир Варанкин — «БЭМ»Владимир Варанкин — «БЭМ»
Владимир Варанкин — «БЭМ»
Yandex5.3K views
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript by Alexey Ivanov
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov1.3K views
CSSO — сжимаем CSS Роман Дворнов, Avito by it-people
 CSSO — сжимаем CSS Роман Дворнов, Avito CSSO — сжимаем CSS Роман Дворнов, Avito
CSSO — сжимаем CSS Роман Дворнов, Avito
it-people441 views
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library by Tatyanazaxarova
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Tatyanazaxarova162 views
Вадим Макишвили "Вёрстка в IntelliJIDEA" by Yandex
Вадим Макишвили "Вёрстка в IntelliJIDEA"Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"
Yandex603 views
Статический анализ кода: Что? Как? Зачем? by Andrey Karpov
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov40 views
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров... by CodeFest
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest734 views
PHP Tricks by BlackFan
PHP TricksPHP Tricks
PHP Tricks
BlackFan2.6K views
Парсим CSS: performance tips & tricks by Roman Dvornov
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
Roman Dvornov1.2K views
Инструментируй это by Roman Dvornov
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov2K views
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM... by Ontico
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico771 views
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект" by Yandex
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Yandex1.2K views

More from Mikhail Davydov

Components now! (in russian) by
Components now! (in russian)Components now! (in russian)
Components now! (in russian)Mikhail Davydov
851 views63 slides
JavaScript. Event Model (in russian) by
JavaScript. Event Model (in russian)JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)Mikhail Davydov
789 views77 slides
JavaScript. OOP (in russian) by
JavaScript. OOP (in russian)JavaScript. OOP (in russian)
JavaScript. OOP (in russian)Mikhail Davydov
727 views77 slides
JavaScript. Event Loop and Timers (in russian) by
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)Mikhail Davydov
1.5K views76 slides
JavaScript. Introduction (in russian) by
JavaScript. Introduction (in russian)JavaScript. Introduction (in russian)
JavaScript. Introduction (in russian)Mikhail Davydov
499 views34 slides
JavaScript. Basics (in russian) by
JavaScript. Basics (in russian)JavaScript. Basics (in russian)
JavaScript. Basics (in russian)Mikhail Davydov
602 views51 slides

More from Mikhail Davydov(10)

JavaScript. Event Model (in russian) by Mikhail Davydov
JavaScript. Event Model (in russian)JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)
Mikhail Davydov789 views
JavaScript. Event Loop and Timers (in russian) by Mikhail Davydov
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov1.5K views
JavaScript. Introduction (in russian) by Mikhail Davydov
JavaScript. Introduction (in russian)JavaScript. Introduction (in russian)
JavaScript. Introduction (in russian)
Mikhail Davydov499 views
JavaScript on frontend and backend (in Russian by Mikhail Davydov
JavaScript on frontend and backend (in RussianJavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in Russian
Mikhail Davydov764 views
Dart - светлая сторона силы? by Mikhail Davydov
Dart - светлая сторона силы?Dart - светлая сторона силы?
Dart - светлая сторона силы?
Mikhail Davydov599 views
Making Scalable JavaScript Application by Mikhail Davydov
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
Mikhail Davydov1.3K views

Code Style (in russian)