Qual è l'approccio raccomandato per le funzioni di supporto in JavaScript?


10

Qual è l'approccio raccomandato per le funzioni di supporto? Vorrei scegliere una tecnica e correre con essa per creare la mia nuova "classe".

Ecco le opzioni di design che ho ponderato:

Opzione 1: funzione di supporto nell'ambito esterno, richiamata con il contesto dell'istanza

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));
    });
}
  • Pro: sintassi semplice. createPanenon è pubblicato sull'istanza.
  • Contro: createPane è accessibile in altri ambiti.

Opzione 2: funzione di supporto in chiusura, invocazione con contesto di istanza

Panes.prototype.initialize = (function () {

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

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

})();
  • Pro: createPane non è pubblicato sull'istanza.
  • Contro: minore leggibilità e testabilità; Il test di questo supporto deve essere eseguito nell'ambito dell'inizializzazione.

Opzione 3: antepone _ al nome per indicare un metodo privato

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

Panes.prototype.initialize = function (panes) {
    // same logic as last, except calls this._createPane
}
  • Pro: il contesto implicito di _createPaneè l'istanza. Testabilità dall'esterno.
  • Contro: esporre la funzione di supporto sull'istanza.

Opzione 4: l'helper funziona come argomento

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

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

})(function createPane () {
   // same logic as last createPane
});
  • Pro: createPane non è pubblicato sull'istanza. Le funzioni di supporto non hanno accesso l'una all'altra.
  • Contro: minore leggibilità e testabilità; Il test di questo supporto deve essere eseguito nell'ambito dell'inizializzazione.

Risposte:


4

Il primo JavaScript non ha classi .

In secondo luogo, la tua terza opzione mi sembra più razionale, ma dipende molto anche dalle tue esigenze. Inoltre, non dovresti essere molto preoccupato di esporre la funzione di aiuto. I pro della soluzione mi giustificano totalmente il compromesso.

Terzo, il tuo tempo come sviluppatore è prezioso; Non rendere le attività banali difficili da implementare, dispendiose in termini di tempo e più propense agli errori umani. La semplicità del codice sorgente è una grande caratteristica stessa.


1
Mahdi grazie. Sono un utente JavaScript da molto tempo e sì, questo è il motivo per cui ho scritto "classe" tra virgolette. Tuttavia, la terminologia è fuorviante e molte organizzazioni professionali fanno riferimento alle funzioni del costruttore JavaScript come classi. developer.mozilla.org/en-US/docs/Web/JavaScript/…
TaylorMac

E grazie per il suggerimento sulla semplicità. La mia domanda riguarda più l'ambito che l'accessibilità. Rigido contro sciolto.
TaylorMac,

@TaylorMac Prego, spero che sia d'aiuto.
Mahdi,

@Mahdi, Javscript ha delle lezioni.
Menai Ala Eddine,

1

La statica appartiene alla funzione IMO, nel tuo caso hai una statica privata, quindi ...

Panes._createPane=function(pane){}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.