Делаю короткую шпору по паттернам, которая объясняет принцип их работы на пальцах. Помощь в наполнении приветствуется.
Паттерн Регистр (Registry)
Обычный способ создания глобального объекта выглядит так:
window.global = {};
Регистр даёт возможность получить или записать значение объекта global без непосредственного обращения к нему. Защищает данные от случайного удаления.
var Registry = new ( function() {
if ( !! window.Registry ) return window.Registry;
var values = {};
this.get = function(key) {
return values[key];
}
this.set = function(key, val) {
values[key] = val;
}
});
Registry.set('name', 'Paul');
Registry.get('name');
Как использовать: конфигурация, общие для всего приложения данные, настройки.
Паттерн Одиночка (Singletone)
Главный признак — может существовать только один объект класса.
Паттерн похож на Регистр (Регистр и есть, по сути, Одиночка). Является коллекцией методов и переменных, связанных ЛОГИЧЕСКИ. В JS можно создавать двумя способами — с помощью Фабрики (читаем далее) и просто объявлением объекта. Ниже объявление объекта.
var Singletone = {
num: 1,
getHref: function() { return window.location.href;},
some_array: []
};
Как использовать: сбор схожих по назначению методов и переменных в едином объекте, разделение большого участка кода на меньшие (опять же, по назначению). Я обычно не забочусь об уникальности, но в кошерном варианте лучше позаботиться.
Паттерн Фабрика (Fabric)
Все знакомы с созданием объекта класса? Паттерн Фабрика является прослойкой между конструктором «new» и вызовом конструктора непосредственно в коде. Появляется возможность создать условия для создания различных объектов, в зависимости от аргументов функции-Фабрики.
var Fabric = function(classType) {
this.classType = classType;
if (classType == 'boots') {
// Класс Boots уже где-то создан
return new Boots();
} else {
// То же самое и с Hats
return new Hats();
}
}
Fabric('boots') == new Boots(); // конечно же не true, но идеологически это именно так
Как использовать: настраиваемое создание класса, классика — создать Зайца или Лису из Фабрики Зверь, опираясь на аргументы.
Паттерн Репозиторий (Repository)
Объединение данных и логики доступа к ним. Допустим:
var PostsRepo = (function() {
var posts = []; // Тут лежат объекты
posts.getById = function(id) {
return this.filter(function(item) {
if (item.id == id) return item;
});
}
// Другие способы работы с данными
return posts;
}());
PostsRepo.push({...});
PostsRepo.push({...});
console.log(PostsRepo.getById(164));
Важно! В данном примере происходит расширение стандартного объекта JS Array, но не его prototype, а уже объекта класса. Prototype расширять строго не рекомендуется из-за возможных багов у базовых типов.
Как использовать: когда есть набор данных и элементарные способы взаимодействия с ними. Лучше не делать две переменные с данными и методами, а объединить. Особенно когда приложение уже очень большое, это поможет сохранить читаемость кода.
Паттерн Хранитель (Memento)
Хранит отпечаток состояния данных и позволяет только прочитать их.
var Memento = function(memory) {
var _data = memory; // Тут лежит отпечаток
var out = {
getMemo: function() {
return _data;
}
return out;
}());
console.log(new Memento( getSomeMomentaryUniqueData() ));
console.log(new Memento( getSomeMomentaryUniqueData() ));
Как использовать: Очень удобно использовать в истории редактирования. Когда нужно ходить вперёд/назад по шагам истории. Шаги — как раз Хранители и хранят состояние данных на момент создания шага.
ссылка на оригинал статьи https://habrahabr.ru/post/317790/
Добавить комментарий