SlideShare una empresa de Scribd logo
1 de 25
Андрей Кулешов




JavaScript
Хороший тон клиентской разработки
JavaScript
Самый популярный и самый ненавидимый язык
программирования в мире


▪ Первая инкарнация – под именем LiveScript (в девичестве Mocha)
▪ Переименован в JavaScript как знак союза двух корпораций
  Этим переименованием были введены в заблуждение, и вводяся до сих пор,
  многие и многие программисты
▪ Стандартизован под именем ECMAScript
▪ Синтаксисом напоминает Си-подобные языки и Java, чем и вызывает
  большую часть ненависти в свой адрес, так как ведет себя иногда
  совершенно по иному.
Где используется ECMAScript?
▪ Браузеры – клиентская часть веб-сайтов.
▪ NodeJS – серверная часть веб-сайтов
▪ Action Script (Flash, Flex)
▪ Шеллы для Windows/Linux
▪ Внедрение в собственные продукты для предоставления пользователям
  возможностей программирования
▪ И даже попытки программировать микроконтроллеры
JavaScript как кривое зеркало Си-языков
▪ JavaScript особенно неприятен людям, которые долго и успешно писали на
  Си-подобных языках
▪ Тут похожие циклы, похожие фигурные скобочки, чуть-чуть похожее
  объявление фукций и переменных...
▪ И совсем другие области видимости и правила работы с необъявленными
  переменными
Проверка и присвоение значений
Си-подобные                                    JavaScript

▪ if (item != null)                            ▪ if (item)
▪ if (str != null && str.length > 0)           ▪ if (str)
▪ if (val != 0) { x = val; } else { x = 5; }   ▪ x = val || 5;
▪ if (item != null) { x = item.text; }         ▪ x = item && item.text;
=== и его злобный брат-близнец ==
▪ Все приходящие с Си-языков пишут:      Выражение           Результат
  if(a == b) {
     …                                   5 == “5”            True
  }
  Оно даже как будто бы работает         0 == null           False
▪ Но очень смешно – пытаясь              undefined == null   True
  приводить типы и сравнивать            „0‟ == „‟           False
  результат.
                                         0 == „0‟            True
▪ Лучше использовать пару === / !==,
  которая не использует приведение       0 == „‟             True
  типов
                                         ' trn ' == 0     True
▪ Тогда ни у кого из читателей кода не   false == „0‟        True
  возникнет вопрос, является ли
  ошибкой равенство 0 == false, или
  это ваш хитрый приѐм
  программирования
Объявление переменных
▪ То, что нужно помнить всегда – областью видимости переменной является
  функция
▪ Причем вся функция, а не только та часть функции, которая ниже
  объявления переменной
Подъем переменых (variables hoisting)
Что пишем мы                   Как это читает JavaScript

function f() {                 function f() {
  var greeting = ‘hello’;        var greeting = ‘hello’,
  for(var i = 0; i < 4; i++)         i = undefined,
  {                                  spaced = undefined;
    var spaces = ‘ ‘ + ‘ ‘;      for(i = 0; i < 4; i++)
    greeting += spaces;          {
  }                                spaces = ‘ ‘ + ‘ ‘;
}                                  greeting += spaces;
                                 }
                               }
Простое правило – пишите так, как это
прочитает JavaScript
▪ Все переменные, используемые в функции, всегда объявляйте на самом еѐ
  верху
▪ Во всей функции должен быть только один оператор var – на первой позиции
▪ Так вы сможете гарантировать отсутствие недопониманий со стороны менее
  опытных разработчиков
▪ И – да, это коренным образом расходится с советом из Си – объявляйте
  переменную по месту еѐ использования
  И поначалу вызывает оторопь.
В сложных функциях появляются огромные
секции объявления переменных
function f() {
var i,
    j,
    k,
    greeting = 'hello',
    total = 0,
    name = "GetDev.NET",
    message = greeting + " " + name,
    st,
    containerId = '#container‘,
    minX,
    maxX,
    minY,
    maxY,
    tempResult,
…..


Что служит неплохим сигналом к рефакторингу
Не засоряйте глобальный объект
▪ Каждая ваша новая переменная, созданная вне функции, добавляется к
  глобальному объекту. Туда же (в обычном режиме) добавляют и
  переменные, которые забыли объявить.
▪ С каждой новой переменной увеличивается риск совпадения имен – как
  между вашими собственными переменными, так и между добавленными
  сторонней библиотекой или плагином браузера/среды выполнения
▪ (Кстати, если вы используете переменную без объявления, причем в любом
  месте, то она, обычно, попадает как раз в глобальный объект. Исключение –
  “strict mode”)
Namespaces
▪ Вообще-то их в JavaScript нет, но, условно говоря, они есть
▪ В качестве namespace используется обычный объект – в идеале – один
  корневой объект на приложение
▪ Все остальные переменные являются его свойствами
var GetDevNet = GetDevNet || {};
GetDevNet.map = new Map();
GetDevNet.url = ‚http://getdev.net/‛

▪ Смысле этого ровно тот же: логическая группировка объектов, функций и
  переменных (теперь – свойств)
Самовызывающиеся функции
▪ Самовызывающаяся функция – функция, которая исполняется немедленно
  после объявления
▪ Смысле еѐ – спрятать внутри себя логику, переменные и данные
(function (GD, $, global) {
    GD.title = $(‚#title‛).text();
})(GetDevNet, jQuery, window);
Замыкания
▪ Хранение ссылок на объекты/значения из более высокого скопа
  function getItemsCounter() {
    var count = 0;
    return {
      getItemsCount: function () {
        return count;
      },
      addItem: function () {
        count++;
      }
    };
  }
▪ Позволяет иметь приватные данные – счетчик здесь
Классы…
▪ Типичные стадии изучения JavaScript:
  - узнаем язык программирования
  - узнаем, что в JS есть классы!
  - узнаем, что в объектах классов нет приватных свойств
  - узнаем, что в JS нет классов. Есть функции-конструкторы
  - узнаем, что в функциях-конструкторах можно организовать приватные
  свойства

 Но это тема отдельная и довольно глубокая.
Модули
▪ Задача модуля – инкапсуляция независимого куска логики
▪ var GetDevModule = (function ($, global) {
    //some initialization…
    …
    var module = {
      …
      …
    } ;
    return module;
  })(jQuery, window);
▪ (function (GetDev, $, global) {
    GetDev.module = {
      …
      …
    };
  })(GetDev, jQuery, window);
Используйте Strict Mode
▪ “strict mode”;
▪ Старые браузеры эту строку проигнорируют, а новые переключатся на
  использование строгого режима – подмножества разрешенных операций
  JavaScript
▪ Тут вы уже не сможете случайно объявить глобальную переменную, что
  плюс уже само по себе
Юнит-тестировние
▪ Юнит-тестирование – это хорошо в принципе
  Но для JavaScript это хорошо особенно
▪ В отличие от компилируемых языков, в которых проверка синтаксиса всего кода
  выполняется естественным образом во время компиляции, об ошибке
  синтаксиса JavaScript мы узнаем только во время выполнения
▪ Автоматически запускаемые юнит-тесты помогают значительно приблизить во
  времени момент выявления ошибки
▪ Вместо цикла «написал - откомпилировал – узнал об ошибке» получаем цикл
  «написал – залился – запустились тесты на Continous Integration-сервере –
  узнал об ошибке».
  Что несколько дольше во времени, но все равно быстрее и надежнее, чем
  «написал – выложил – получил сообщение от пользователей «что-то не
  работает»»
Существующие фреймворки
▪ QUnit – от автором jQuery, написанный для тестирования jQuery
  Просто нормальный фреймворк
  Набор ассертов, setup/teardown, визуальный интерфейс как HTML-страница
  Выполняется внутри браузера (просто открываем HTML-файл с тестами)
  Отсутствует возможность запуска на сервере вне браузера
▪ JUnit JS – тот же шарик, вид сбоку
  assertEqual-операции принимают аргументы в порядке, обратном QUnit, так
  что заменить в процессе один на другой будет более проблематично
▪ Jasmine – Behavior Driven Development фреймворк
  Из плюсов – улучшенная поддержка Mock- и Spy-объектов из коробки
▪ PhantomJS – среда для запуска JavaScript-тестов без браузера
Организация Continous Integration
▪ Первый подход – запускать на сервере браузер и прогонять в нѐм тесты


▪ Второй подход – запускать на сервере тесты в невизуальной среде
  (PhantomJS, V8)


▪ Оба подхода имеют преимущества и недостатки
Демо – создание страницы с тестами
Интересное чтение
▪ JavaScript: the Good Parts by Douglas Crockford
▪ http://javascript.ru
▪ StackOverflow – unit testing discussion
Интересное видео
▪ The Tale of JavaScript. I Mean ECMAScript. by Douglas Crockford
▪ Good JavaScript Habits for C# Developers by Elijah Manor
▪ Structuring JavaScript Code – Pluralsight
▪ Crockford on JavaScript video series on Yahoo!
Интересные ссылки
▪ JSLint - средство поиска очевидных ошибок и проверка следованию
  хорошему стилю программирования
  http://www.jslint.com/
▪ JS Fiddle – средство исполнения кода, разметки и CSS-стилей в онлайне
  http://jsfiddle.net/
▪ QUnit
  http://qunit.org
▪ PhantomJS
  http://phantomjs.org/
Вопросы?
                 Внимательно слушаю! 


Андрей Кулешов

kaa-tula@ya.ru
    akuleshov.tula




Специально для http://GetDev.NET

Más contenido relacionado

La actualidad más candente

ПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курсаПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курсаAlexey Paznikov
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтендTimophy Chaptykov
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»Roman Dvornov
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Async Javascript
Async JavascriptAsync Javascript
Async JavascriptGetDev.NET
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 

La actualidad más candente (20)

ПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курсаПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курса
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
JRebel
JRebelJRebel
JRebel
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
WTF Code @ jug.lv
WTF Code @ jug.lvWTF Code @ jug.lv
WTF Code @ jug.lv
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 

Destacado

Silverlight for Windows Phone 7
Silverlight for Windows Phone 7Silverlight for Windows Phone 7
Silverlight for Windows Phone 7GetDev.NET
 
Continous Integration
Continous IntegrationContinous Integration
Continous IntegrationGetDev.NET
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложенийGetDev.NET
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
Workflow Foundation
Workflow FoundationWorkflow Foundation
Workflow FoundationGetDev.NET
 
Windows communication foundation 4
Windows communication foundation 4Windows communication foundation 4
Windows communication foundation 4GetDev.NET
 
Introduction to Azure AppFabric
Introduction to Azure AppFabricIntroduction to Azure AppFabric
Introduction to Azure AppFabricGetDev.NET
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIAGetDev.NET
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - KinectGetDev.NET
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCGetDev.NET
 
NoSQL databases and CouchDB
NoSQL databases and CouchDBNoSQL databases and CouchDB
NoSQL databases and CouchDBGetDev.NET
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковGetDev.NET
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервисGetDev.NET
 
LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It WorksGetDev.NET
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolutionGetDev.NET
 

Destacado (20)

Mercurial
MercurialMercurial
Mercurial
 
PowerShell
PowerShellPowerShell
PowerShell
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Silverlight for Windows Phone 7
Silverlight for Windows Phone 7Silverlight for Windows Phone 7
Silverlight for Windows Phone 7
 
Continous Integration
Continous IntegrationContinous Integration
Continous Integration
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
ASP.NET MVC 4
ASP.NET MVC 4ASP.NET MVC 4
ASP.NET MVC 4
 
Workflow Foundation
Workflow FoundationWorkflow Foundation
Workflow Foundation
 
Windows communication foundation 4
Windows communication foundation 4Windows communication foundation 4
Windows communication foundation 4
 
Introduction to Azure AppFabric
Introduction to Azure AppFabricIntroduction to Azure AppFabric
Introduction to Azure AppFabric
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - Kinect
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
NoSQL databases and CouchDB
NoSQL databases and CouchDBNoSQL databases and CouchDB
NoSQL databases and CouchDB
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
 
LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It Works
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolution
 

Similar a JavaScript: хороший тон клиентской разработки

Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!Roman Dvornov
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...lshevtsov
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)AvitoTech
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle IntroductionKirill Rozov
 
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис РечкуновJSib
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 

Similar a JavaScript: хороший тон клиентской разработки (20)

Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 

Más de GetDev.NET

Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееGetDev.NET
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистовGetDev.NET
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеGetDev.NET
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015GetDev.NET
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революцияGetDev.NET
 
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКGetDev.NET
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIGetDev.NET
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013GetDev.NET
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...GetDev.NET
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego MindstormsGetDev.NET
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8GetDev.NET
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3CGetDev.NET
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.NET
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - SurfaceGetDev.NET
 

Más de GetDev.NET (19)

Go
GoGo
Go
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
 
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3C
 
WinRT
WinRTWinRT
WinRT
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - Surface
 

JavaScript: хороший тон клиентской разработки

  • 1. Андрей Кулешов JavaScript Хороший тон клиентской разработки
  • 2. JavaScript Самый популярный и самый ненавидимый язык программирования в мире ▪ Первая инкарнация – под именем LiveScript (в девичестве Mocha) ▪ Переименован в JavaScript как знак союза двух корпораций Этим переименованием были введены в заблуждение, и вводяся до сих пор, многие и многие программисты ▪ Стандартизован под именем ECMAScript ▪ Синтаксисом напоминает Си-подобные языки и Java, чем и вызывает большую часть ненависти в свой адрес, так как ведет себя иногда совершенно по иному.
  • 3. Где используется ECMAScript? ▪ Браузеры – клиентская часть веб-сайтов. ▪ NodeJS – серверная часть веб-сайтов ▪ Action Script (Flash, Flex) ▪ Шеллы для Windows/Linux ▪ Внедрение в собственные продукты для предоставления пользователям возможностей программирования ▪ И даже попытки программировать микроконтроллеры
  • 4. JavaScript как кривое зеркало Си-языков ▪ JavaScript особенно неприятен людям, которые долго и успешно писали на Си-подобных языках ▪ Тут похожие циклы, похожие фигурные скобочки, чуть-чуть похожее объявление фукций и переменных... ▪ И совсем другие области видимости и правила работы с необъявленными переменными
  • 5. Проверка и присвоение значений Си-подобные JavaScript ▪ if (item != null) ▪ if (item) ▪ if (str != null && str.length > 0) ▪ if (str) ▪ if (val != 0) { x = val; } else { x = 5; } ▪ x = val || 5; ▪ if (item != null) { x = item.text; } ▪ x = item && item.text;
  • 6. === и его злобный брат-близнец == ▪ Все приходящие с Си-языков пишут: Выражение Результат if(a == b) { … 5 == “5” True } Оно даже как будто бы работает 0 == null False ▪ Но очень смешно – пытаясь undefined == null True приводить типы и сравнивать „0‟ == „‟ False результат. 0 == „0‟ True ▪ Лучше использовать пару === / !==, которая не использует приведение 0 == „‟ True типов ' trn ' == 0 True ▪ Тогда ни у кого из читателей кода не false == „0‟ True возникнет вопрос, является ли ошибкой равенство 0 == false, или это ваш хитрый приѐм программирования
  • 7. Объявление переменных ▪ То, что нужно помнить всегда – областью видимости переменной является функция ▪ Причем вся функция, а не только та часть функции, которая ниже объявления переменной
  • 8. Подъем переменых (variables hoisting) Что пишем мы Как это читает JavaScript function f() { function f() { var greeting = ‘hello’; var greeting = ‘hello’, for(var i = 0; i < 4; i++) i = undefined, { spaced = undefined; var spaces = ‘ ‘ + ‘ ‘; for(i = 0; i < 4; i++) greeting += spaces; { } spaces = ‘ ‘ + ‘ ‘; } greeting += spaces; } }
  • 9. Простое правило – пишите так, как это прочитает JavaScript ▪ Все переменные, используемые в функции, всегда объявляйте на самом еѐ верху ▪ Во всей функции должен быть только один оператор var – на первой позиции ▪ Так вы сможете гарантировать отсутствие недопониманий со стороны менее опытных разработчиков ▪ И – да, это коренным образом расходится с советом из Си – объявляйте переменную по месту еѐ использования И поначалу вызывает оторопь.
  • 10. В сложных функциях появляются огромные секции объявления переменных function f() { var i, j, k, greeting = 'hello', total = 0, name = "GetDev.NET", message = greeting + " " + name, st, containerId = '#container‘, minX, maxX, minY, maxY, tempResult, ….. Что служит неплохим сигналом к рефакторингу
  • 11. Не засоряйте глобальный объект ▪ Каждая ваша новая переменная, созданная вне функции, добавляется к глобальному объекту. Туда же (в обычном режиме) добавляют и переменные, которые забыли объявить. ▪ С каждой новой переменной увеличивается риск совпадения имен – как между вашими собственными переменными, так и между добавленными сторонней библиотекой или плагином браузера/среды выполнения ▪ (Кстати, если вы используете переменную без объявления, причем в любом месте, то она, обычно, попадает как раз в глобальный объект. Исключение – “strict mode”)
  • 12. Namespaces ▪ Вообще-то их в JavaScript нет, но, условно говоря, они есть ▪ В качестве namespace используется обычный объект – в идеале – один корневой объект на приложение ▪ Все остальные переменные являются его свойствами var GetDevNet = GetDevNet || {}; GetDevNet.map = new Map(); GetDevNet.url = ‚http://getdev.net/‛ ▪ Смысле этого ровно тот же: логическая группировка объектов, функций и переменных (теперь – свойств)
  • 13. Самовызывающиеся функции ▪ Самовызывающаяся функция – функция, которая исполняется немедленно после объявления ▪ Смысле еѐ – спрятать внутри себя логику, переменные и данные (function (GD, $, global) { GD.title = $(‚#title‛).text(); })(GetDevNet, jQuery, window);
  • 14. Замыкания ▪ Хранение ссылок на объекты/значения из более высокого скопа function getItemsCounter() { var count = 0; return { getItemsCount: function () { return count; }, addItem: function () { count++; } }; } ▪ Позволяет иметь приватные данные – счетчик здесь
  • 15. Классы… ▪ Типичные стадии изучения JavaScript: - узнаем язык программирования - узнаем, что в JS есть классы! - узнаем, что в объектах классов нет приватных свойств - узнаем, что в JS нет классов. Есть функции-конструкторы - узнаем, что в функциях-конструкторах можно организовать приватные свойства Но это тема отдельная и довольно глубокая.
  • 16. Модули ▪ Задача модуля – инкапсуляция независимого куска логики ▪ var GetDevModule = (function ($, global) { //some initialization… … var module = { … … } ; return module; })(jQuery, window); ▪ (function (GetDev, $, global) { GetDev.module = { … … }; })(GetDev, jQuery, window);
  • 17. Используйте Strict Mode ▪ “strict mode”; ▪ Старые браузеры эту строку проигнорируют, а новые переключатся на использование строгого режима – подмножества разрешенных операций JavaScript ▪ Тут вы уже не сможете случайно объявить глобальную переменную, что плюс уже само по себе
  • 18. Юнит-тестировние ▪ Юнит-тестирование – это хорошо в принципе Но для JavaScript это хорошо особенно ▪ В отличие от компилируемых языков, в которых проверка синтаксиса всего кода выполняется естественным образом во время компиляции, об ошибке синтаксиса JavaScript мы узнаем только во время выполнения ▪ Автоматически запускаемые юнит-тесты помогают значительно приблизить во времени момент выявления ошибки ▪ Вместо цикла «написал - откомпилировал – узнал об ошибке» получаем цикл «написал – залился – запустились тесты на Continous Integration-сервере – узнал об ошибке». Что несколько дольше во времени, но все равно быстрее и надежнее, чем «написал – выложил – получил сообщение от пользователей «что-то не работает»»
  • 19. Существующие фреймворки ▪ QUnit – от автором jQuery, написанный для тестирования jQuery Просто нормальный фреймворк Набор ассертов, setup/teardown, визуальный интерфейс как HTML-страница Выполняется внутри браузера (просто открываем HTML-файл с тестами) Отсутствует возможность запуска на сервере вне браузера ▪ JUnit JS – тот же шарик, вид сбоку assertEqual-операции принимают аргументы в порядке, обратном QUnit, так что заменить в процессе один на другой будет более проблематично ▪ Jasmine – Behavior Driven Development фреймворк Из плюсов – улучшенная поддержка Mock- и Spy-объектов из коробки ▪ PhantomJS – среда для запуска JavaScript-тестов без браузера
  • 20. Организация Continous Integration ▪ Первый подход – запускать на сервере браузер и прогонять в нѐм тесты ▪ Второй подход – запускать на сервере тесты в невизуальной среде (PhantomJS, V8) ▪ Оба подхода имеют преимущества и недостатки
  • 21. Демо – создание страницы с тестами
  • 22. Интересное чтение ▪ JavaScript: the Good Parts by Douglas Crockford ▪ http://javascript.ru ▪ StackOverflow – unit testing discussion
  • 23. Интересное видео ▪ The Tale of JavaScript. I Mean ECMAScript. by Douglas Crockford ▪ Good JavaScript Habits for C# Developers by Elijah Manor ▪ Structuring JavaScript Code – Pluralsight ▪ Crockford on JavaScript video series on Yahoo!
  • 24. Интересные ссылки ▪ JSLint - средство поиска очевидных ошибок и проверка следованию хорошему стилю программирования http://www.jslint.com/ ▪ JS Fiddle – средство исполнения кода, разметки и CSS-стилей в онлайне http://jsfiddle.net/ ▪ QUnit http://qunit.org ▪ PhantomJS http://phantomjs.org/
  • 25. Вопросы? Внимательно слушаю!  Андрей Кулешов kaa-tula@ya.ru akuleshov.tula Специально для http://GetDev.NET