Backbone. Шашлык на косточке

Владимир Кузнецов

Backbone.
Шашлык на косточке

Backbone

Массивы разнотипных объектов

Нет типизации — можно хранить любые объекты вперемешку

			var list = [
			  {a: 1, b: 2},
			  42,
			  "test"
			];
		

Backbone.Collection

В коллекции тоже можно хранить модели любых типов

			var c = new Backbone.Collection();
			c.add(new App.ItemMessage());
			c.add(new App.ItemNews());
		

Backbone.Collection

Если в коллекцию добавляется простой объект, то для него создаётся модель (по-умолчанию это Backbone.Model)

			var c = new Backbone.Collection({
			  model: App.Item
			});
		

Полиморфизм

«Один интерфейс, множество реализаций»

Фактически реализуется наследованием

Демонстрация

			App.Item = Backbone.Model.extend({});
			App.ItemNews = App.Item.extend({});
			App.ItemAction = App.Item.extend({});
			
		

Способы создания экземпляров класса

Оператор new

			var item = new App.Item();
			var itemNews = new App.ItemNews();
		

Способы создания экземпляров класса

Фабричный метод

Используется, когда классу заранее неизвестно, объекты каких подклассов ему нужно создавать.

Статический метод класса.

Фабричный метод

			var item = App.Item.create(
			  "Could you give me an item"
			);
			var itemNews = App.Item.create(
			  "One more item of type of news, please"
			);
		

Фабричный метод

			var itemNews = App.Item.create({
			  id: 10,
			  type: "news",
			  text: "Beckham to donate PSG pay to charity"
			});
		

Фабричный метод

Ну не писать же для каждого типа сущностей свою фабрику.

Напишем фабрику фабрик!

Страшно звучит?

Фабрика фабрик

			App.Factory = function (getter, hash, def) {
			  return function () {
			    var value = getter.apply(this, arguments);
			    var ctor = hash[value] ? hash[value] : def;
			    return new ctor(arguments[0], arguments[1]);
			  };
            };
		
			App.ItemFactory = App.Factory(
			  function (attr) { return attr.type; },
			  {
			    "news": App.ItemNews,
			    "action": App.ItemAction,
			    "message": App.ItemMessage
		      },
			  App.Item
			);
		

Фабрика — это конструктор,
только лучше

			var item = new App.ItemFactory({
			});
			var itemNews = App.ItemFactory({
			  type: "news",
			  text: "Prisoners running disco in Venezuela"
			});
		

Фабрику можно передать в качестве
конструктора

			App.Items = Backbone.Collection.extend({
    		  model: App.ItemFactory
  			});
		

Коллекция будет автоматически заполняться объектами нужного типа. PROFIT!

Фабрику можно использовать и для создания экземпляров Backbone.View

			App.ItemViewFactory = App.Factory(
			  function (options) {
			    return options.model.get("type");
			  },
			
			);
		

Почему бы не использовать
if … then … else?

Потому что ифы — зло!
The Clean Code Talks — Inheritance, Polymorphism & Testing

Особенно актуально для шаблонов. Подобное «программирование» можно смело вынести в тестируемый JS-код.

Заключение

Слайды и примеры на GitHub:
bit.ly/fronttalks-bb

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

Владимир Кузнецов
Твиттер: @mista_k
Блог: noteskeeper.ru

Слайды и примеры на GitHub:
bit.ly/fronttalks-bb