Упрощенная шпаргалка по шаблонам проектирования

от автора

Делаю короткую шпору по паттернам, которая объясняет принцип их работы на пальцах. Помощь в наполнении приветствуется.

Паттерн Регистр (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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *