Каков рекомендуемый подход для вспомогательных функций? Я хотел бы выбрать одну технику и запустить ее, чтобы создать свой новый «класс».
Вот варианты дизайна, которые я обдумал:
Вариант 1: вспомогательная функция во внешней области, вызывается с контекстом экземпляра
function createPane (pane) {
// logic to create pane
var proto = Object.create(this.paneList);
$.extend(paneProto, pane);
return paneProto;
}
Panes.prototype.initialize = function (panes) {
var _this = this;
_.each(panes, function () {
_this.panes.push(createPane.call(_this, this));
});
}
- Плюсы: простой синтаксис.
createPane
не опубликовано в данном случае. - Минусы:
createPane
доступно в других областях.
Вариант 2: вспомогательная функция в закрытии, вызов с контекстом экземпляра
Panes.prototype.initialize = (function () {
function createPane (pane) {
// same logic as last createPane
}
return function (panes) {
// same logic as before - calls createPane
}
})();
- Плюсы:
createPane
не опубликовано по инстанции. - Минусы: снижение читабельности и тестируемости; Тестирование этого помощника должно происходить в области инициализации.
Вариант 3: добавьте _ к имени, чтобы указать частный метод
Panes.prototype._createPane = function (pane) {
// same logic as last createPane
}
Panes.prototype.initialize = function (panes) {
// same logic as last, except calls this._createPane
}
- Плюсы: неявный контекст
_createPane
это экземпляр. Тестируемость со стороны. - Минусы: Предоставление вспомогательной функции в экземпляре.
Вариант 4: вспомогательные функции в качестве аргументов
Panes.prototype.initialize = (function (createPane) {
return function (panes) {
// same logic as before - calls createPane
}
})(function createPane () {
// same logic as last createPane
});
- Плюсы:
createPane
не опубликовано по инстанции. Вспомогательные функции не имеют доступа друг к другу. - Минусы: снижение читабельности и тестируемости; Тестирование этого помощника должно происходить в области инициализации.