Qual é a abordagem recomendada para funções auxiliares em JavaScript?

9

Qual é a abordagem recomendada para funções auxiliares? Eu gostaria de escolher uma técnica e executá-la para criar minha nova "classe".

Aqui estão as opções de design que eu ponderei:

Opção 1: Função auxiliar no escopo externo, invoque com o contexto da instância

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));
    });
}
  • Prós: Sintaxe simples. createPanenão é publicado na instância.
  • Contras: createPane é acessível em outros escopos.

Opção 2: Função auxiliar no fechamento, invoque com o contexto da instância

Panes.prototype.initialize = (function () {

    function createPane (pane) {
        // same logic as last createPane
    }

    return function (panes) {
        // same logic as before - calls createPane
    }

})();
  • Prós: createPane não é publicado na instância.
  • Contras: Menor legibilidade e testabilidade; O teste desse auxiliar deve ocorrer no escopo da inicialização.

Opção 3: adicione _ ao nome para indicar um método privado

Panes.prototype._createPane = function (pane) {
    // same logic as last createPane
}

Panes.prototype.initialize = function (panes) {
    // same logic as last, except calls this._createPane
}
  • Prós: O contexto implícito de _createPaneé a instância. Testabilidade do lado de fora.
  • Contras: Expor a função auxiliar na instância.

Opção 4: O auxiliar funciona como argumentos

Panes.prototype.initialize = (function (createPane) {

    return function (panes) {
        // same logic as before - calls createPane
    }

})(function createPane () {
   // same logic as last createPane
});
  • Prós: createPane não é publicado na instância. As funções auxiliares não têm acesso um ao outro.
  • Contras: Menor legibilidade e testabilidade; O teste desse auxiliar deve ocorrer no escopo da inicialização.
TaylorMac
fonte

Respostas:

4

Primeiro, o JavaScript não tem classes .

Segundo, sua terceira opção parece mais racional para mim, mas também depende muito de seus requisitos. Além disso, você não deve se preocupar muito em expor a função auxiliar. Os profissionais da solução justificam totalmente o compromisso para mim.

Terceiro, seu tempo como desenvolvedor é valioso; Não torne as tarefas triviais difíceis de implementar, demoradas e mais propensas a erros humanos. A simplicidade do código fonte é um ótimo recurso.

Mahdi
fonte
11
Mahdi obrigado. Eu sou um usuário JavaScript de longa data e, sim, essa é a razão pela qual escrevi "classe" entre aspas. Embora a terminologia seja enganosa, e muitas organizações profissionais se referem às funções de construtor do JavaScript como classes. developer.mozilla.org/pt-BR/docs/Web/JavaScript/…
TaylorMac
E obrigado pela sugestão de simplicidade. Minha pergunta é mais sobre escopo do que qualquer coisa, acessibilidade. Rigoroso vs. Solto.
precisa
@ TaylorMac De nada, espero que ajude.
Mahdi
1

As estáticas pertencem à Função IMO, no seu caso você tem uma estática privada, então ...

Panes._createPane=function(pane){}
Marca
fonte