Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ШРИ - Code Style

ШРИ - Code Style

Mikhail Davydov

September 23, 2013
Tweet

More Decks by Mikhail Davydov

Other Decks in Education

Transcript

  1. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. 6
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А

    View Slide

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

    View Slide

  8. 8
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б

    View Slide

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

    View Slide

  10. 10

    View Slide

  11. 11
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б
    А: Что за говнокод?

    View Slide

  12. 12
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А
    Б: У самого говнокод!

    View Slide

  13. 13
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б
    А: Почему так ф-ю
    написал?

    View Slide

  14. 14
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А
    Б: А ты вообще табы
    используешь!

    View Slide

  15. 15
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б
    А: Зачем тут скобка?

    View Slide

  16. 16
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А
    Б: Уайтсмитс? Ты из
    какой пещеры вылез?

    View Slide

  17. 17
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б
    А: Зачем тут точка с
    запятой?

    View Slide

  18. 18
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А
    Б: А ты зачем перенос
    не поставил?

    View Slide

  19. 19
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Код разработчика Б
    А: RTFM or GTFO!

    View Slide

  20. 20
    function name(value)
    -tab->{
    -tab->-tab->var a = 0, b = 42;
    -tab->-tab->if (value) return a
    -tab->}
    Код разработчика А
    Б: А в бубен?

    View Slide

  21. 21

    View Slide

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

    View Slide

  23. 23
    Организационный профит Code Style
    •  Это закон
    –  Должна быть отдельная страница о которой все знают
    –  Страницу просто найти
    •  Закон разрешает конфликты
    –  Не знание закона не освобождает от ответственности
    •  Решает большинство проблем
    •  Эту страницу нужно дать прочитать перед
    началом работы

    View Slide

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

    View Slide

  25. Применение CS
    Для быстрого восприятия кода
    Для предотвращения ошибок в коде
    Для быстрого написания кода

    View Slide

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

    View Slide

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

    View Slide

  28. 28
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Обобщение соседних элементов

    View Slide

  29. 29
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Обобщение соседних элементов
    Перенос строки разрывает обобщение

    View Slide

  30. 30
    .b-form {
    font-family: Arial;
    font-size: 2em;
    padding: 0 10px;
    min-height: 100px;
    }
    Обобщение соседних элементов
    Перенос строки разделяет разные типы CSS
    ствойств и обобщает соседние элементы

    View Slide

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

    View Slide

  32. 32
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Вертикаль – список
    var - список переменных

    View Slide

  33. 33
    var name = function (value) {
    ..var a = 0
    ...., b = 42
    ...., c = 42
    ...., d = 42
    ....;
    };
    Вертикаль – список
    Coma-first style – его цель уменьшить число
    ошибок.

    View Slide

  34. 34
    var name = function (value) {
    ..var a = 0
    ...., b = 42
    ....c = 42
    ...., d = 42
    ....;
    };
    Вертикаль – список
    Отсутствие запятых легко заметить

    View Slide

  35. 35
    var a =
    ..{ b: 2
    .., c: 3
    .., d: 4
    ..}
    ..;
    Вертикаль – список
    Coma-first style для литералов Object
    https://gist.github.com/357981

    View Slide

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

    View Slide

  37. 37
    .b-form {
    -webkit-transition: color;
    -moz-transition: color;
    -ms-transition: color;
    -o-transition: color;
    transition: color;
    }
    Вертикаль – список
    Выравнивание по свойству

    View Slide

  38. 38
    .b-form {
    -webkit-transition: color;
    -moz-transition: color;
    -ms-transition: color;
    -o-transition: color;
    transition: color;
    }
    Вертикаль – список
    Выравнивание по значению
    Так проще прочитать

    View Slide

  39. 39

    ....Abc
    ....Abc
    ....Abc

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

    View Slide

  40. 40
    jQuery('.clickable')
    .....filter('a')
    .....click(handler)
    .....end()
    .....show('slow')
    ....;
    Вертикаль – список
    Вызов функций по цепочке – список

    View Slide

  41. 41
    if (typeof a !== "undefined" &&
    typeof b !== "undefined" &&
    typeof c === "string") {
    // your stuff
    }
    Вертикаль – список
    Несколько условий – список

    View Slide

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

    View Slide

  43. 43
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Единообразие
    Похожий код быстрее воспринять

    View Slide

  44. 44
    // Этот пробел обязательный
    function A(value) {
    }
    // Этот пробел для единообразия
    var A = function (value) {
    };
    Единообразие
    Похожий код быстрее воспринять

    View Slide

  45. Разрядка

    View Slide

  46. 46
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Разрядка
    БуряМглоюНебоКроет vs
    Буря мглою небо кроет

    View Slide

  47. 47
    for ( var i = 0 ; i < 100 ; i++ ){
    }
    for (var i = 0; i < 100; i++){
    }
    Разрядка, но без фанатизма
    Буря Мглою Небо Кроет vs
    Буря мглою небо кроет

    View Slide

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

    View Slide

  49. 49

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

    View Slide

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

    View Slide

  51. 51
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    if (value) {
    ....return a;
    }
    };
    Начало блока "видит" конец блока
    Код представляет из себя "параграфы
    текста"

    View Slide

  52. 52
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Начало блока "видит" конец блока
    Код представляет из себя "параграфы
    текста"

    View Slide

  53. 53

    ....Abc
    ....Abc
    ....Abc

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

    View Slide

  54. 54

    ....
    ........Abc
    ....
    ....
    ........Abc
    ....

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

    View Slide

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

    View Slide

  56. 56

    ....
    ........Abc
    ....
    ....
    ........Abc
    ....

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

    View Slide

  57. 57
    Лишние пробелы
    Переносы и пробел = +2 лишних пробельных
    символа
    var item = $('.b-item')[0];
    if (item.innerHTML = "Abc") {
    // Недостижим
    }

    View Slide

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

    View Slide

  59. 59
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    }
    Точка с запятой в Function Expression

    View Slide

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

    View Slide

  61. 61
    var name = function (value) {
    }var name2 = function (value) {
    }
    Точка с запятой в Function Expression
    SyntaxError: missing ; before statement

    View Slide

  62. 62
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........return a;
    ....}
    };
    Точка с запятой в Function Expression

    View Slide

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

    View Slide

  64. 64
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value)
    ........return a;
    };
    Скобки у циклов и условий
    Лень писать скобки

    View Slide

  65. 65
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value)
    ........a = 42;
    ........return a;
    };
    Скобки у циклов и условий
    Редкая логическая ошибка

    View Slide

  66. 66
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) {
    ........a = 42;
    ........return a;
    ....}
    };
    Скобки у циклов и условий

    View Slide

  67. 67
    var name = function (value) {
    ....var a = 0,
    ........b = 42;
    ....if (value) return a;
    };
    Скобки у циклов и условий
    Много скобок создает много шума

    View Slide

  68. Auto semicolon insertion

    View Slide

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

    View Slide

  70. 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

    View Slide

  71. Последнее свойство перекрывает
    предшествующее
    Свойства с префиксами в CSS

    View Slide

  72. 72
    .b-form {
    box-shadow: 0 0 400px 200px #000;
    -webkit-box-shadow: 0 0 400px 200px #000;
    }
    Свойства с префиксами в CSS

    View Slide

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

    View Slide

  74. 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/

    View Slide

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

    View Slide

  76. 76
    Еще несколько слов…
    •  Документирование неявного кода
    –  Код должен быть максимально самодокументируемым
    •  Написание примеров использования
    –  Чтобы не рыться в коде
    •  Сокращение длины строки
    –  Чтобы не вертеть головой и не скролить
    •  Уменьшение уровней вложенности
    –  Быстрее читать код
    •  Единообразие в модулях и именах
    •  Автоматизированная проверка кода ♥
    –  IDE
    –  Pre Commit Hook

    View Slide

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

    View Slide

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

    View Slide

  79. 79
    Как мы делаем в Яндексе
    •  Love & Peace
    •  У каждого проекта свой Code Style
    –  Страница в Вики
    –  Или CONTRIBUTE.md файл в корне проекта
    •  Есть стиль по умолчанию
    –  Страница в Вики со стилей по языкам
    –  Не обязательный – на случай если лень
    •  Стараемся использовать общепринятый
    –  Так проще новым разработчикам
    –  Привычней читать сторонний код
    •  Code Review
    –  Зависит от размера проекта
    –  Как правило новички проходят обязательно

    View Slide

  80. 80
    Заключение
    •  Соглашение Code Style - Must have!
    •  Нужно знать меру
    –  Разрядка пробелами
    –  Фигурные скобки
    •  Все правила имеют на то причину

    View Slide

  81. 81

    View Slide

  82. 82
    Михаил Давыдов
    Разработчик JavaScript
    [email protected]
    azproduction
    Спасибо

    View Slide