Михаил Давыдов — Code Style

82

description

 

Transcript of Михаил Давыдов — Code Style

Page 1: Михаил Давыдов — Code Style
Page 2: Михаил Давыдов — Code Style

Михаил Давыдов Разработчик JavaScript

Code Style

Page 3: Михаил Давыдов — Code Style

В ролях - разработчик А - разработчик Б (новичек)

История про разработчиков

Page 4: Михаил Давыдов — Code Style

4

Эта история вымышленная и к Яндексу не относится

Page 5: Михаил Давыдов — Code Style

Жил-был один разработчик и писал вот так:

Page 6: Михаил Давыдов — Code Style

6

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Page 7: Михаил Давыдов — Code Style

7

В проект пришел еще один и стал писать так:

Page 8: Михаил Давыдов — Code Style

8

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

Page 9: Михаил Давыдов — Code Style

9

И общего Code Style у них не было…

Page 10: Михаил Давыдов — Code Style

10

Page 11: Михаил Давыдов — Code Style

11

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

А: Что за говнокод?

Page 12: Михаил Давыдов — Code Style

12

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Б: У самого говнокод!

Page 13: Михаил Давыдов — Code Style

13

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

А: Почему так ф-ю написал?

Page 14: Михаил Давыдов — Code Style

14

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Б: А ты вообще табы используешь!

Page 15: Михаил Давыдов — Code Style

15

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

А: Зачем тут скобка?

Page 16: Михаил Давыдов — Code Style

16

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Б: Уайтсмитс? Ты из какой пещеры вылез?

Page 17: Михаил Давыдов — Code Style

17

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

А: Зачем тут точка с запятой?

Page 18: Михаил Давыдов — Code Style

18

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Б: А ты зачем перенос не поставил?

Page 19: Михаил Давыдов — Code Style

19

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Код разработчика Б

А: RTFM or GTFO!

Page 20: Михаил Давыдов — Code Style

20

function name(value) -tab->{ -tab->-tab->var a = 0, b = 42; -tab->-tab->if (value) return a -tab->}

Код разработчика А

Б: А в бубен?

Page 21: Михаил Давыдов — Code Style

21

Page 22: Михаил Давыдов — Code Style

22

Нужна договоренность в стиле кода

Page 23: Михаил Давыдов — Code Style

23

Организационный профит Code Style

• Это закон –  Должна быть отдельная страница о которой все знают –  Страницу просто найти

• Закон разрешает конфликты –  Не знание закона не освобождает от ответственности

• Решает большинство проблем • Эту страницу нужно дать прочитать перед началом работы

Page 24: Михаил Давыдов — Code Style

24

Если не понятно, то нужно дать понять причину ввода такого Code Style

Page 25: Михаил Давыдов — Code Style

Применение CS

Для быстрого восприятия кода

Для предотвращения ошибок в коде

Для быстрого написания кода

Page 26: Михаил Давыдов — Code Style

26

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

Page 27: Михаил Давыдов — Code Style

Обобщение элементов

Page 28: Михаил Давыдов — Code Style

28

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Обобщение соседних элементов

Page 29: Михаил Давыдов — Code Style

29

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Обобщение соседних элементов

Перенос строки разрывает обобщение

Page 30: Михаил Давыдов — Code Style

30

.b-form { font-family: Arial; font-size: 2em; padding: 0 10px; min-height: 100px; }

Обобщение соседних элементов Перенос строки разделяет разные типы CSS ствойств и обобщает соседние элементы

Page 31: Михаил Давыдов — Code Style

Вертикаль – список

Page 32: Михаил Давыдов — Code Style

32

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Вертикаль – список

var - список переменных

Page 33: Михаил Давыдов — Code Style

33

var name = function (value) { ..var a = 0 ...., b = 42 ...., c = 42 ...., d = 42 ....; };

Вертикаль – список Coma-first style – его цель уменьшить число ошибок.

Page 34: Михаил Давыдов — Code Style

34

var name = function (value) { ..var a = 0 ...., b = 42 ....c = 42 ...., d = 42 ....; };

Вертикаль – список Отсутствие запятых легко заметить

Page 35: Михаил Давыдов — Code Style

35

var a = ..{ b: 2 .., c: 3 .., d: 4 ..} ..;

Вертикаль – список Coma-first style для литералов Object

https://gist.github.com/357981

Page 36: Михаил Давыдов — Code Style

36

ALL code is ugly. Yours, mine, everyone's. Code Is Ugly. Just face it.

Page 37: Михаил Давыдов — Code Style

37

.b-form { -webkit-transition: color; -moz-transition: color; -ms-transition: color; -o-transition: color; transition: color; }

Вертикаль – список

Выравнивание по свойству

Page 38: Михаил Давыдов — Code Style

38

.b-form { -webkit-transition: color; -moz-transition: color; -ms-transition: color; -o-transition: color; transition: color; }

Вертикаль – список Выравнивание по значению Так проще прочитать

Page 39: Михаил Давыдов — Code Style

39

<ol class="b-list"> ....<li class="b-item">Abc</li> ....<li class="b-item">Abc</li> ....<li class="b-item">Abc</li> </ol>

Вертикаль – список

Page 40: Михаил Давыдов — Code Style

40

jQuery('.clickable') .....filter('a') .....click(handler) .....end() .....show('slow') ....;

Вертикаль – список Вызов функций по цепочке – список

Page 41: Михаил Давыдов — Code Style

41

if (typeof a !== "undefined" && typeof b !== "undefined" && typeof c === "string") { // your stuff }

Вертикаль – список Несколько условий – список

Page 42: Михаил Давыдов — Code Style

Единообразие

Page 43: Михаил Давыдов — Code Style

43

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Единообразие

Похожий код быстрее воспринять

Page 44: Михаил Давыдов — Code Style

44

// Этот пробел обязательный function A(value) { } // Этот пробел для единообразия var A = function (value) { };

Единообразие

Похожий код быстрее воспринять

Page 45: Михаил Давыдов — Code Style

Разрядка

Page 46: Михаил Давыдов — Code Style

46

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Разрядка БуряМглоюНебоКроет vs Буря мглою небо кроет

Page 47: Михаил Давыдов — Code Style

47

for ( var i = 0 ; i < 100 ; i++ ){ } for (var i = 0; i < 100; i++){ }

Разрядка, но без фанатизма Буря Мглою Небо Кроет vs Буря мглою небо кроет

Page 48: Михаил Давыдов — Code Style

48

Сильно разряженный код сложно воспринять

Page 49: Михаил Давыдов — Code Style

49

<div class="b-header"></div>

Однако не везде она работает В HTML перед и после равно пробел как правило не ставят

Page 50: Михаил Давыдов — Code Style

Начало - конец

Page 51: Михаил Давыдов — Code Style

51

var name = function (value) { ....var a = 0, ........b = 42; if (value) { ....return a; } };

Начало блока "видит" конец блока Код представляет из себя "параграфы текста"

Page 52: Михаил Давыдов — Code Style

52

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Начало блока "видит" конец блока Код представляет из себя "параграфы текста"

Page 53: Михаил Давыдов — Code Style

53

<div class="b-header"> ....<div class="b-item">Abc</div> ....<div class="b-item">Abc</div> ....<div class="b-item">Abc</div> </div>

Начало блока "видит" конец блока

Page 54: Михаил Давыдов — Code Style

54

<div class="b-header"> ....<div class="b-item"> ........Abc ....</div> ....<div class="b-item"> ........Abc ....</div> </div>

Начало блока "видит" конец блока Не везде это применимо: много писать, мельтешение, баги с пробелами

Page 55: Михаил Давыдов — Code Style

Предотвращение ошибок

Page 56: Михаил Давыдов — Code Style

56

<div class="b-header"> ....<div class="b-item"> ........Abc ....</div> ....<div class="b-item"> ........Abc ....</div> </div>

Лишние пробелы Переносы и пробел = +2 лишних пробельных символа

Page 57: Михаил Давыдов — Code Style

57

Лишние пробелы Переносы и пробел = +2 лишних пробельных символа

var item = $('.b-item')[0]; if (item.innerHTML = "Abc") { // Недостижим }

Page 58: Михаил Давыдов — Code Style

Точка с запятой в FE

Page 59: Михаил Давыдов — Code Style

59

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} }

Точка с запятой в Function Expression

Page 60: Михаил Давыдов — Code Style

60

cat **/*.js > all.js!

Page 61: Михаил Давыдов — Code Style

61

var name = function (value) { }var name2 = function (value) { }

Точка с запятой в Function Expression SyntaxError: missing ; before statement

Page 62: Михаил Давыдов — Code Style

62

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return a; ....} };

Точка с запятой в Function Expression

Page 63: Михаил Давыдов — Code Style

Скобки у циклов

Page 64: Михаил Давыдов — Code Style

64

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) ........return a; };

Скобки у циклов и условий Лень писать скобки

Page 65: Михаил Давыдов — Code Style

65

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) ........a = 42; ........return a; };

Скобки у циклов и условий Редкая логическая ошибка

Page 66: Михаил Давыдов — Code Style

66

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........a = 42; ........return a; ....} };

Скобки у циклов и условий

Page 67: Михаил Давыдов — Code Style

67

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) return a; };

Скобки у циклов и условий Много скобок создает много шума

Page 68: Михаил Давыдов — Code Style

Auto semicolon insertion

Page 69: Михаил Давыдов — Code Style

69

var name = function (value) { ....var a = 0, ........b = 42; ....if (value) { ........return ............{pewpew: a}; ....} };

Auto semicolon insertion

Page 70: Михаил Давыдов — Code Style

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

Page 71: Михаил Давыдов — Code Style

Последнее свойство перекрывает предшествующее

Свойства с префиксами в CSS

Page 72: Михаил Давыдов — Code Style

72

.b-form { box-shadow: 0 0 400px 200px #000; -webkit-box-shadow: 0 0 400px 200px #000; }

Свойства с префиксами в CSS

Page 73: Михаил Давыдов — Code Style

73

Свойства с префиксами в CSS

Page 74: Михаил Давыдов — Code Style

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/

Page 75: Михаил Давыдов — Code Style

75

Свойства с префиксами в CSS

Page 76: Михаил Давыдов — Code Style

76

Еще несколько слов…

• Документирование неявного кода –  Код должен быть максимально самодокументируемым

• Написание примеров использования –  Чтобы не рыться в коде

• Сокращение длины строки –  Чтобы не вертеть головой и не скролить

• Уменьшение уровней вложенности –  Быстрее читать код

• Единообразие в модулях и именах • Автоматизированная проверка кода ♥

–  IDE –  Pre Commit Hook

Page 77: Михаил Давыдов — Code Style

77

Код должен выглядеть так как будто его пишет один человек

Page 78: Михаил Давыдов — Code Style

78

А как в Яндексе?

Page 79: Михаил Давыдов — Code Style

79

Как мы делаем в Яндексе

• Love & Peace • У каждого проекта свой Code Style

–  Страница в Вики –  Или CONTRIBUTE.md файл в корне проекта

• Есть стиль по умолчанию –  Страница в Вики со стилей по языкам –  Не обязательный – на случай если лень

• Стараемся использовать общепринятый –  Так проще новым разработчикам –  Привычней читать сторонний код

• Code Review –  Зависит от размера проекта –  Как правило новички проходят обязательно

Page 80: Михаил Давыдов — Code Style

80

Заключение

• Соглашение Code Style - Must have! • Нужно знать меру

–  Разрядка пробелами –  Фигурные скобки

• Все правила имеют на то причину

Page 81: Михаил Давыдов — Code Style

81

Page 82: Михаил Давыдов — Code Style

82

Михаил Давыдов

Разработчик JavaScript

[email protected] azproduction

Спасибо