JavaScript – Паттерны проектирования – Кто я?



JavaScript – Паттерны проектирования – Кто я?

1 0


js-patterns-slides

Исходник презентации с webinar.loftblog.ru ивента

On Github sergeylaptev / js-patterns-slides

JavaScript

Паттерны проектирования

Кто я?

@iamsergeylaptev

Признаки хорошего кода

Удобочитаемость Непротиворечивость Предсказуемость Единство стиля Наличие документации

Немного теории

В общем случае слово «паттерн» – это широко- используемый вариант решения часто повторяющихся задач

Важно уметь выделять шаблоны, потому что:

  • Они помогают писать более эффективный программный код, используя наработанные приемы и не изобретая велосипед.
  • Они предоставляют дополнительный уровень абстракции.
  • Они упрощают дискуссию между разработчиками.

Давай уже паттерны! =/

Группы паттернов

  • Предназначенные для создания

    Конструктор, Фабрика, Прототип, Одиночка, Модуль и тд.

  • Предназначенные для организации архитектуры

    Декоратор, Фасад, Прокси и тд.

  • Привносящие определенную модель поведения

    Наблюдатель, Паттерн цепочек и тд.

Примеры реализации паттернов

Модуль

Модуль

var myModule = {

  myProperty: "someValue",

  myConfig: {
    useCaching: true,
    language: "ru"
  },

  myMethod: function () {
    console.log( "Сообщение, которое выводит метод myMethod" );
  },

  myMethod2: function () {
    console.log( "Язык сайта:" + this.myConfig.language);
  }

  getMyProperty: function() {
    console.log( this.myProperty );
  }

};

Модуль использование

// Выведет: Сообщение, которое выводит метод myMethod
myModule.myMethod();

// Выведет: Язык сайта: ru
myModule.myMethod2();

// Выведет: someValue
myModule.getMyProperty();

Модуль с приватными свойствами

var testModule = (function () {

  var counter = 0;

  return {

    incrementCounter: function () {
      return counter++;
    },

    resetCounter: function () {
      console.log( "Значение счетчика до сброса: " + counter );
      counter = 0;
    }
  };

})();

Модуль с приватными свойствами использование

// Увеличиваем значение счетчика на единицу
testModule.incrementCounter();

// Проверяем значение и обнуляем
// Вывод: Значение счетчика до сброса1
testModule.resetCounter();

Примеры реализации паттернов

Декоратор

Декоратор с приватными свойствами


function Vehicle( vehicleType ){

  this.vehicleType = vehicleType || "Лодка";
  this.model = "стандартная";
  this.sign = "П-123-21";

}

var testInstance = new Vehicle( "Авто" );
console.log( testInstance );

var truck = new Vehicle( "Грузовик" );

truck.setModel = function( modelName ){
    this.model = modelName;
};

truck.setColor = function( color ){
    this.color = color;
};

truck.setModel( "MAN" );
truck.setColor( "Синий" );

console.log( truck );

var secondInstance = new Vehicle( "Авто" );
console.log( secondInstance );

Примеры реализации паттернов

Наблюдатель

Наблюдатель

var PubSub = function() {};

PubSub.prototype.subscribe = function(topic, callback, context) {
  context = context || this;
  this._topics = this._topics || {};
  this._topics[topic] = this._topics.topic || [];
  this._topics[topic].push({ "context": context, "callback" : callback });
};

PubSub.prototype.publish = function(topic) {
  this._topics[topic].forEach(function(subscription) {
    subscription.callback.call(subscription.context);
  });
};

PubSub.prototype.addTag = function(tag) {
  this._tags = this._tags || [];
  this._tags.push(tag);
  this.publish && this.publish("tag:added");
};

var object = new PubSub();

object.subscribe("tag:added", function() {
  console.log('Тег добавлен');
});

object.addTag("Тест");

object.addTag("Крутой тег");

Важное уточнение

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

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

Немедленно спросите меня о чём-нибудь;)