Продвинутый javascript. Лучшие практики и шаблоны проектирования

Содержание

Слайд 2

Научись говорить на языке javascript Привыкни к четкому code style и

Научись говорить на языке javascript

Привыкни к четкому code style и внедри

его
Избегай глобальных переменных. Не засоряй и учитывай глобальную область видимости
var всегда в самом верху функции
Названия переменных верблюдиком (varName)
Не забывай точки с запятыми (jslint/jshint)

Логичные и правильные названия переменных
используй === за место ==
Используй литералы и краткие нотации
Не миксуй технологии (js,css,html)
Названия функций-конструкторов (классов) с большой буквы

Слайд 3

Не лезь в чужой монастырь…прими его правила Понимай как работают js

Не лезь в чужой монастырь…прими его правила

Понимай как работают js функции

и this
Пойми hoisting (поднятие переменных) и
scopes (области видимости)
Пойми замыкания
Понимай как работает асинхронность (ajax - callbacks, listeners, promises, deferred)

Понимай как работает прототипное наследование с помощью функций-конструкторов (классов) и Object.create
Пойми iife (Immediately-Invoked Function Expression) – функция которая вызывается сразу после объявления и паттерн модуля (module pattern)

Слайд 4

Придерживайся хорошего тона Пиши комментарии (jsDoc) Используй цепные вызовы функций Не

Придерживайся хорошего тона

Пиши комментарии (jsDoc)
Используй цепные вызовы функций
Не создавай html на

js. используй шаблонизаторы
Организуй свой код (ооп)

Не используй var в циклах
Используй для функций-конструкторов (классов) options объекты
Одна функция – одно действие. Упрощай и дроби до логичного максимума.
DRY (Don’t repeat yourself)

Слайд 5

Лучшие Javascript Style Guides Google: http://google.github.io/styleguide/javascriptguide.xml Airbnb: https://github.com/airbnb/javascript Github: https://github.com/styleguide/javascript Mozilla: https://goo.gl/HtFRDb

Лучшие Javascript Style Guides

Google: http://google.github.io/styleguide/javascriptguide.xml
Airbnb: https://github.com/airbnb/javascript
Github: https://github.com/styleguide/javascript
Mozilla: https://goo.gl/HtFRDb

Слайд 6

Организация кода и ООП ООП в js - инкапсуляция, абстракция, насследование

Организация кода и ООП

ООП в js - инкапсуляция, абстракция, насследование и

полиморфизм

Инкапсулируй код в модулях. Организуй однотипные данные в объекты.
Старайся делать минимум зависимостей. Все модули независимы
Выноси общий и дополнительный (расширяющий) функционал в абстракции – прототипы (классы)

Наследуй нужные свойства и методы от прототипов
Не забывай про полиморфизм и используй/заимствуй методы нужного тебе прототипа

Слайд 7

Инкапсуляция

Инкапсуляция

Слайд 8

Наследование и абстракция

Наследование и абстракция

Слайд 9

Полиморфизм

Полиморфизм

Слайд 10

Пиши поддерживаемый код ! Интуитивный Понятный Легко адаптируемый Расширяемый Отлаживаемый (debuggable)

Пиши поддерживаемый код !

Интуитивный
Понятный
Легко адаптируемый
Расширяемый
Отлаживаемый (debuggable)
Тестируемый (Jasmine, Karma)

Почему запариваемся над поддерживаемым

кодом?
Слайд 11

Потому что 80% времени мы поддерживаем код, а не пишем его!

Потому что 80% времени мы поддерживаем код, а не пишем его!

Слайд 12

Design Patterns (Шаблоны проектирования) Убирают дублирование Общая терминология Быстрое взаимодействие Генерируемые

Design Patterns (Шаблоны проектирования)
Убирают дублирование
Общая терминология
Быстрое взаимодействие
Генерируемые и переиспользуемые компоненты

Доказанные парадигмы.

Они работают!
Легкие в тестировании
Поддерживают изменения системы
Слайд 13

Виды шаблонов Пораждающие (Creational) Constructor, Factory, Prototype, Singleton Структурные (Structural) Module,

Виды шаблонов

Пораждающие (Creational)
Constructor, Factory, Prototype, Singleton
Структурные (Structural)
Module, Decorator, Façade
-

Поведенческие (Behavioral)
Mediator, Observer

Addy Osmani JS Patterns

Слайд 14

АРХИТЕКТУРА СОВРЕМЕННОГО JS ПРИЛОЖЕНИЯ 2 парадигмы: MVC и поддерживаемая и расширяемая

АРХИТЕКТУРА СОВРЕМЕННОГО JS ПРИЛОЖЕНИЯ

2 парадигмы: MVC и поддерживаемая и расширяемая javascript

архитектура
Ключ к поддерживаемости и расширяемости - независимые модули, не только js, но и css, html.
Nicholas Zakas: nczonline.net
Addy Osmani: addyosmani.com/blog
Слайд 15

Паттерны MV* Model-View-Controller (MVC) Модель-представление-контроллер. Контроллер и представление зависят от модели

Паттерны MV*

Model-View-Controller (MVC)
Модель-представление-контроллер. Контроллер и представление зависят от модели

(подписаны на ее изменение), но модель никак не зависит от этих двух компонент
Model-View-Presenter
Presenter посредник между моделью и представлением. Решает все вопросы. Представление не подписывается на изменения модели.
Model-View-View-Model
Изменение состояния модели автоматически изменяет представление и наоборот, поскольку используется механизм связывания данных (Bindings/синхронизация)
Слайд 16

Model

Model

Слайд 17

View

View

Слайд 18

Controller

Controller

Слайд 19

Поддерживаемая и расширяемая javascript архитектура - Независимые модули (Module) - Ядро

Поддерживаемая и расширяемая javascript архитектура

- Независимые модули (Module)
- Ядро (Mediator)
-

Sandbox (Façade)
- библиотеки и наборы инструментов
Слайд 20

В классическом случае по N.Zakas и Addy Osmani Mediator (ядро) – Facade (sandbox controller) - Modules

В классическом случае по N.Zakas и Addy Osmani

Mediator (ядро) – Facade

(sandbox controller) - Modules
Слайд 21

Шаблон Module - Инкапсулированная частичка приложения - Взаимозаменяемая единичная часть большой

Шаблон Module

- Инкапсулированная частичка приложения
- Взаимозаменяемая единичная часть большой системы, которая

может быть легко переиспользована
- Модули хотят оповестить ядро - когда что-то интересное происходит
В веб-приложениях состоят не только из программного кода (js) но и из html, css
В очень крупных приложениях каждый модуль может содержать MVC
Слайд 22

Шаблон Module

Шаблон Module

Слайд 23

Шаблон Module - Все что после return, это - public methods.

Шаблон Module

- Все что после return, это - public methods. до

– private
- И подобные паттерны есть во всех знаменитых библиотеках, включая jquery
Слайд 24

Современные модульные паттерны Формат для написания модулей javascript в браузере (AMD

Современные модульные паттерны

Формат для написания модулей javascript в браузере (AMD -

require.js, browserify)
Модульный формат оптимизированный для сервера (commonjs)
ES harmony - модули будущего
Слайд 25

Шаблон Facade - позволяет скрыть сложность системы путем сведения всех возможных

Шаблон Facade

- позволяет скрыть сложность системы путем сведения всех возможных внешних

вызовов к одному объекту, делегирующему их соответствующим объектам системы.
ДУМАЙТЕ ОБ ЭТОМ КАК ОБ API
коммуникации с модулями
ajax запросы
dom-манипуляции
установка/снятие обработчиков событий
запрос на расширение возможностей через расширения
Слайд 26

Шаблон Facade Теперь можно использовать addMyEvent - даже не зная что

Шаблон Facade

Теперь можно использовать addMyEvent - даже не зная что внутри

он
выполняет три сложных действия
Слайд 27

Слайд 28

Шаблон Mediator - Глобальный диспетчер событий Взаимодействие между модулями осуществляется путём

Шаблон Mediator

- Глобальный диспетчер событий
Взаимодействие между модулями осуществляется путём посылки

сообщений глобальному диспетчеру, а уже он принимает решение что с этим сообщением делать — создать/удалить модули, дёрнуть методы других модулей, выполнить какой то метод итд
Инкапсулирует как разрозненные модули взаимодействуют друг с другом, выступая в роли посредника
Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.
Жизненный цикл модулей
Взаимодействия между модулями
Обработка ошибок
Расширения
Слайд 29

Слайд 30

https://github.com/aranm/scalable-javascript-architecture

https://github.com/aranm/scalable-javascript-architecture

Слайд 31

https://github.com/aurajs/aura

https://github.com/aurajs/aura

Слайд 32

http://scaleapp.org/

http://scaleapp.org/

Слайд 33

Слайд 34

ПРОИЗВОДИТЕЛЬНОСТЬ, ПРОФИЛИРОВАНИЕ И ТЕСТИРОВАНИЕ Оптимизируйте циклы. Уменьшайте количество итераций в циклах.

ПРОИЗВОДИТЕЛЬНОСТЬ, ПРОФИЛИРОВАНИЕ И ТЕСТИРОВАНИЕ

Оптимизируйте циклы. Уменьшайте количество итераций
в циклах.
Уменьшайте количество

операций в каждой отдельной итерации
Используйте локальные переменные
Поменьше трогайте DOM-дерево. А если трогаете, то сведите количество операции к минимуму.

Кешируйте всё, что возможно. Особенно длинные цепочки св-в (избегай длинного наследования) в объектах и переменные в циклах
Избегайте затратных операций
Аккуратно используйте регулярки.
Не сбрасывайте браузерные кеши на repaint и reflow.
В больших проектах пишите unit-тесты (BDD, TDD)
Пишите меньше кода.

Слайд 35

Не забывай предохраняться! (безопасность) Проверяй все получаемые данные Используй безопасные HTTP

Не забывай предохраняться! (безопасность)

Проверяй все получаемые данные
Используй безопасные HTTP заголовки
(чтобы браузер

не интерпретировал JSON как HTML итд)

Что произошло в браузере, остается в браузере (доступ к личным данным, строгая валидация и решения по безопасности должны быть написаны на сервере)
Не доверяй данным! js легко взломать (XSS). Не парси строки текста приходящие от куда угодно!

Слайд 36

USE THE SOURCE AND YOUR HEAD, LUKE! Пользуйся документацией Mozilla Developer

USE THE SOURCE AND YOUR HEAD, LUKE!

Пользуйся документацией Mozilla Developer Network
Задавай

вопросы и ищи ответы на stackoverflow и google
DRY (don't repeat yourself) и объединяй все что можно до разумного минимализма. не пиши лишнего кода. Не изобретай велосипед!
Читай исходники крутых библиотек и приложений!
Слайд 37

Спасибо за внимание! И помните…. “Большой путь, маленькими шагами” Чернобаев Николай. 2015

Спасибо за внимание!

И помните….
“Большой путь, маленькими шагами”

Чернобаев Николай. 2015