SlideShare une entreprise Scribd logo
1  sur  82
Télécharger pour lire hors ligne
Code Style


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




  В ролях
    - разработчик А
    - разработчик Б (новичек)
Эта история вымышленная
    и к Яндексу не относится



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



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




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



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



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

     ....if (value) {
     ........return a;
     ....}
     };
8
И общего Code Style у них
    не было…



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



      var name = function (value) {
      ....var a = 0,
      А: Что за говнокод?
      ........b = 42;

      ....if (value) {
      ........return a;
      ....}
      };
11
Код разработчика А



      function name(value)
      -tab->{
     Б: У самого говнокод!
      -tab->-tab->var a = 0, b = 42;
      -tab->-tab->if (value) return a
      -tab->}




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



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



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




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



      var name = function (value) {
     А: Зачем тут скобка?
      ....var a = 0,
      ........b = 42;

      ....if (value) {
      ........return a;
      ....}
      };
15
Код разработчика А



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



      А: Зачем тут точка с
      var name = function (value) {
      ....var a = 0,
           запятой?
      ........b = 42;

      ....if (value) {
      ........return a;
      ....}
      };
17
Код разработчика А



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



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



      function name(value)
      -tab->{
           Б: А в бубен?
      -tab->-tab->var a = 0, b = 42;
      -tab->-tab->if (value) return a
      -tab->}




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



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


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

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

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


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


24
Применение CS

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

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



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

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

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

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

     ....if (value) {
     ........return a;
     ....}
     };
29
Обобщение соседних элементов
     Перенос строки разделяет разные типы CSS
     ствойств и обобщает соседние элементы

     .b-form {
         font-family: Arial;
         font-size: 2em;

          padding: 0 10px;
          min-height: 100px;
     }

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

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

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

      ....if (value) {
      ........return a;
      ....}
      };
32
Вертикаль – список
     Coma-first style – его цель уменьшить число
     ошибок.

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

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

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

      };

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


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


35
                        https://gist.github.com/357981
ALL code is ugly.
     Yours, mine, everyone's.
     Code Is Ugly. Just face it.


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

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

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

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

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

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



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



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


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


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


     if (typeof a !== "undefined" &&
         typeof b !== "undefined" &&
         typeof c === "string") {

          // your stuff
     }


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

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

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

     ....if (value) {
     ........return a;
     ....}
     };
43
Единообразие

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

     // Этот пробел обязательный
     function A(value) {

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

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

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

     ....if (value) {
     ........return a;
     ....}
     };
46
Разрядка, но без фанатизма
       Буря      Мглою     Небо   Кроет vs
     Буря мглою небо кроет

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

     }

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

     }

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



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



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




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

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

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

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

      ....if (value) {
      ........return a;
      ....}
      };
52
Начало блока "видит" конец блока



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



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

     <div class="b-header">
     ....<div class="b-item">
     ........Abc
     ....</div>
     ....<div class="b-item">
     ........Abc
     ....</div>
     </div>
54
Предотвращение ошибок
Лишние пробелы
     Переносы и пробел = +2 лишних пробельных
     символа

     <div class="b-header">
     ....<div class="b-item">
     ........Abc
     ....</div>
     ....<div class="b-item">
     ........Abc
     ....</div>
     </div>
56
Лишние пробелы
     Переносы и пробел = +2 лишних пробельных
     символа


     var item = $('.b-item')[0];

     if (item.innerHTML = "Abc") {
         // Недостижим
     }


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



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

      ....if (value) {
      ........return a;
      ....}
      }
59
cat **/*.js > all.js!




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


      var name = function (value) {

      }var name2 = function (value) {

      }




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



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

      ....if (value) {
      ........return a;
      ....}
      };
62
Скобки у циклов
Скобки у циклов и условий
     Лень писать скобки


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

      ....if (value)
      ........return a;
      };

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


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

      ....if (value)
      ........a = 42;
      ........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) return a;
      };


67
Auto semicolon insertion
Auto semicolon insertion


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

     ....if (value) {
     ........return
     ............{pewpew: a};
     ....}
     };
69
Auto semicolon insertion
     После return будет поставлена ;

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

     ....if (value) {
     ........return;
     ............{pewpew: a};
     ....}
     };
70                        http://es5.github.com/#x7.9
Свойства с префиксами в CSS




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



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




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




73
Свойства с префиксами в CSS
     Последним должен идти свойство без
     префикса


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




74                  http://pepelsbey.net/pres/pre-fixes/
Свойства с префиксами в CSS




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

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

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

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

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

     •  Единообразие в модулях и именах
     •  Автоматизированная проверка кода ♥
      –  IDE
      –  Pre Commit Hook
76
Код должен выглядеть так
     как будто его пишет один
     человек


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


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

     •  Love & Peace
     •  У каждого проекта свой Code Style
      –  Страница в Вики
      –  Или CONTRIBUTE.md файл в корне проекта

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

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

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




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

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



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

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




          azproduction@yandex-team.ru
          azproduction




82
     Спасибо

Contenu connexe

En vedette

Marketing presentation for Apple inc.
Marketing presentation for Apple inc.Marketing presentation for Apple inc.
Marketing presentation for Apple inc.Yazan Nayrab
 
A Generic Apple "Steve Jobs" style Keynote Address Presentation
A Generic Apple "Steve Jobs" style Keynote Address PresentationA Generic Apple "Steve Jobs" style Keynote Address Presentation
A Generic Apple "Steve Jobs" style Keynote Address PresentationThe App Store Chronicle
 
VIPER architecture
VIPER architectureVIPER architecture
VIPER architectureAlex Rudyak
 
Strategic Management Presentation - Apple Inc.
Strategic Management Presentation - Apple Inc.Strategic Management Presentation - Apple Inc.
Strategic Management Presentation - Apple Inc.Colby Nelson
 

En vedette (8)

Apple macbook pro
Apple macbook proApple macbook pro
Apple macbook pro
 
Apple slides
Apple slidesApple slides
Apple slides
 
Формула BizTalk
Формула BizTalkФормула BizTalk
Формула BizTalk
 
Marketing presentation for Apple inc.
Marketing presentation for Apple inc.Marketing presentation for Apple inc.
Marketing presentation for Apple inc.
 
A Generic Apple "Steve Jobs" style Keynote Address Presentation
A Generic Apple "Steve Jobs" style Keynote Address PresentationA Generic Apple "Steve Jobs" style Keynote Address Presentation
A Generic Apple "Steve Jobs" style Keynote Address Presentation
 
Apple Keynote
Apple KeynoteApple Keynote
Apple Keynote
 
VIPER architecture
VIPER architectureVIPER architecture
VIPER architecture
 
Strategic Management Presentation - Apple Inc.
Strategic Management Presentation - Apple Inc.Strategic Management Presentation - Apple Inc.
Strategic Management Presentation - Apple Inc.
 

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

Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksRoman Dvornov
 
CSSO — минимизируем CSS
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSSRoman Dvornov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'110xffAA
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
CSSO – история ускорения
CSSO – история ускоренияCSSO – история ускорения
CSSO – история ускоренияRoman Dvornov
 
BDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehaveBDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehaveSQALab
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмdasha2012
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвЮрий Сыровецкий
 
CSSO — сжимаем CSS Роман Дворнов, Avito
 CSSO — сжимаем CSS Роман Дворнов, Avito CSSO — сжимаем CSS Роман Дворнов, Avito
CSSO — сжимаем CSS Роман Дворнов, Avitoit-people
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 

Similaire à Михаил Давыдов — Code Style (20)

Code Style (in russian)
Code Style (in russian)Code Style (in russian)
Code Style (in russian)
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
CSSO — минимизируем CSS
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSS
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'11
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
CSSO – история ускорения
CSSO – история ускоренияCSSO – история ускорения
CSSO – история ускорения
 
BDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehaveBDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehave
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритм
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон Холомьёв
 
CSSO — сжимаем CSS Роман Дворнов, Avito
 CSSO — сжимаем CSS Роман Дворнов, Avito CSSO — сжимаем CSS Роман Дворнов, Avito
CSSO — сжимаем CSS Роман Дворнов, Avito
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Scala on android
Scala on androidScala on android
Scala on android
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 

Plus de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Plus de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

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

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