Владимир Кузнецов
Нет типизации — можно хранить любые объекты вперемешку
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