Каков рекомендуемый подход для вспомогательных функций в JavaScript?

10

Каков рекомендуемый подход для вспомогательных функций? Я хотел бы выбрать одну технику и запустить ее, чтобы создать свой новый «класс».

Вот варианты дизайна, которые я обдумал:

Вариант 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 не опубликовано по инстанции. Вспомогательные функции не имеют доступа друг к другу.
  • Минусы: снижение читабельности и тестируемости; Тестирование этого помощника должно происходить в области инициализации.
TaylorMac
источник

Ответы:

4

Во-первых, в JavaScript нет классов .

Во-вторых, ваш третий вариант кажется мне более рациональным, но он также сильно зависит от ваших требований. Кроме того, вы не должны сильно беспокоиться о предоставлении вспомогательной функции. Плюсы решения полностью оправдывают компромисс для меня.

В-третьих, ваше время как разработчика ценно; Не усложняйте выполнение тривиальных задач, отнимайте много времени и более подверженные человеческим ошибкам. Простота исходного кода - отличная особенность.

мессия
источник
1
Махди спасибо. Я долгое время пользовался JavaScript, и да, именно поэтому я написал «класс» в кавычках. Хотя терминология вводит в заблуждение, и многие профессиональные организации называют функции конструктора JavaScript классами. developer.mozilla.org/en-US/docs/Web/JavaScript/…
TaylorMac
И спасибо за предложение о простоте. Мой вопрос больше о сфере, чем о доступности. Строгий против Свободного.
TaylorMac
@TaylorMac Добро пожаловать, надеюсь, это поможет.
Махди
@Mahdi, у Javscript есть классы.
Menai Ala Eddine
1

Статика принадлежит функции IMO, в вашем случае у вас есть частная статика, так что ...

Panes._createPane=function(pane){}
отметка
источник