Владимир Кузнецов
Нет типизации — можно хранить любые объекты вперемешку
var list = [{a: 1, b: 2},42,"test"];
В коллекции тоже можно хранить модели любых типов
var c = new Backbone.Collection();c.add(new App.ItemMessage());c.add(new App.ItemNews());
Если в коллекцию добавляется простой объект, то для него создаётся модель (по-умолчанию это 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({});
А какой класс передавать в конструктор коллекции?
App.Items = Backbone.Collection.extend({model: WHAT???});
Оператор 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");},…);
Потому что ифы — зло!
The Clean Code Talks —
Inheritance, Polymorphism & Testing
Особенно актуально для шаблонов. Подобное «программирование» можно смело вынести в тестируемый JS-код.
Слайды и примеры на GitHub:
bit.ly/fronttalks-bb
Владимир Кузнецов
Твиттер: @mista_k
Блог: noteskeeper.ru
Слайды и примеры на GitHub:
bit.ly/fronttalks-bb