javascript design patterns overview by ksenia redunova
TRANSCRIPT
JavaScript Design Patterns overview
Ксения Редунова
Шаблоны проектирования
Зачем они нужны?
“In my view, large-scale JavaScript apps are nontrivial
applications requiring significant developer
effort to maintain, where most heavy lifting of data
manipulation and display falls to the browser.”
- Addy Osmani
Что такое паттерны?
По словам Кристофера Александра,
“любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново”
Категории паттернов
Порождающие шаблоны (Creational)Создание объектов
Структурные шаблоны (Structural)Изменяют интерфейс и функциональность уже
существующих объектовРешают проблемы организации больших структур
Поведенческие шаблоны (Behavioral)Взаимодействие объектов
CreationalSingleton
Module
Factory
Abstract factory
Builder
Prototype
Lazy initialization
Multiton
Object pool
RAII
Structural
• Facade
• Decorator
• Adapter
• Bridge
• Composite
• Front Controller
• Flyweight
• Proxy
Behavioral
• Observer (Pub/Sub)
• Mediator
• Iterator
• Chain of responsibility
• Command
• Interpreter
• Memento
• Servant
• Strategy
• …MV*
Недостатки
Нет подхода, определяющего, когда и как применять те или иные паттерны
Преимущества
Паттерны способствуют повторному использованию, решая общие проблемы дизайна
Применение паттернов облегчает документирование кода
Если программист знаком с паттернами, то ему будет легче поддерживать такой код
Антипаттерны
Andrew Koenig (1995):
Describe a bad solution to a particular problem which resulted in a bad situation occurring
Describe how to get out of said situation and how to go from there to a good solution
Антипаттерны
Глобальные переменные
Передача строк в setTimeout() или setInterval() (это вызывает eval())
Изменение прототипа Object
Внедрение JavaScript непосредственно в html код
document.write вместо document.createElement
Singleton
var mySingleton = {};
Настоящий singleton работает так:
var my1 = new Single();
var my2 = new Single();
>>> my1 === my2
true
Но в JavaScript все не так просто ☺
Singleton
Проблема: Свойство instance - public
Singleton
• Внутренняя функция имеет доступ к переменным и аргументам внешней функции
• Эти переменные существуют, пока существует ссылка на внутреннюю функцию
Замыкание (closure)
14
Достоинства:
Компактный код
Маленькие функции
Недостатки:
Код сложнее в отладке
Роберт Мартин (“Clean Code”): «Крушение поезда»
Chaining
Chaining
Использует парадигму Singleton
Использует замыкания и самовызывающиеся функции (IIFE)
Не засоряет глобальное пространство имен
Поддерживает приватные данные
Хорошо масштабируется по мере роста приложения
“Anything can be defined as a reusable module”
- Zakas.
Module
(function () {
// all vars and functions are in this scope only
// and access to all globals
}());
Преимущество: ничто не глобально
Проблема: это анонимный модуль – нет доступа снаружи (callbacks, обработчики событий)
IIFE
Импортируем глобальные переменные
Расширяем модуль
Module
Модификация модуля, когда все методы являются частными, а в конце определения модуля
принимается решение, каким из них следует стать общедоступными
Revealing Module Pattern
21
Фабрика
Выполнение повторяющихся операций, необходимых при создании похожих объектов
Способ создания объектов без необходимости знать их тип (класс)
Фабрика
Конструктор Object()
Фасад
Фасад делает нашу жизнь проще
Сложную логику легко скрыть за фасадными методами
Удобен для реализации кроссбраузерных решений
Фасад
Pub/Sub
Backbone Events
onoff
trigger
_.extend(object, Backbone.Events);
27
Pub/Sub
28
MV*: MVC, MVP, MVVM
MVC
MV*
MVPPresenter извлекает данные из Модели и форматирует их для отображения в Виде
MVVMМодель вида (ViewModel, что означает «Model of View») Команды, которыми может пользоваться Вид,
чтобы влиять на Модель обертку данных из Модели, которые подлежат
связыванию
Полезные советы
“The secret to building large apps is never build large
apps. Break your applications into small pieces. Then,
assemble those testable, bite-sized pieces into your
big application” - Justin Meyer.
“The more tied components are to each other, the less reusable they will be, and the more difficult it
becomes to make changes to one without accidentally affecting another” - Rebecca Murphey.
Литература
JavaScript Patterns by Stoyan Stefanov
Writing Maintainable JavaScript by Nicholas Zakas
Learning JavaScript Design Patterns by Addy Osmani
Patterns for Large-Scale JavaScript Application Architecture by Addy Osmani
Learning JavaScript Design Patterns by Addy Osmani
http://jsdesignpatterns.com
http://shichuan.github.io/javascript-patterns/
and many more
Ксения Редунова
Thank You!