Quelle est l'approche recommandée pour les fonctions d'assistance en JavaScript?

10

Quelle est l'approche recommandée pour les fonctions d'assistance? Je voudrais choisir une technique et courir avec elle pour créer ma nouvelle "classe".

Voici les options de conception que j'ai envisagées:

Option 1: fonction d'assistance dans la portée externe, invoquer avec le contexte de l'instance

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));
    });
}
  • Avantages: syntaxe simple. createPanen'est pas publié sur l'instance.
  • Inconvénients: createPane est accessible dans d'autres étendues.

Option 2: fonction d'assistance en fermeture, invoquer avec le contexte de l'instance

Panes.prototype.initialize = (function () {

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

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

})();
  • Avantages: createPane n'est pas publié sur l'instance.
  • Inconvénients: lisibilité et testabilité inférieures; Le test de cet assistant doit avoir lieu dans le cadre de l'initialisation.

Option 3: ajouter _ au nom pour indiquer une méthode privée

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

Panes.prototype.initialize = function (panes) {
    // same logic as last, except calls this._createPane
}
  • Avantages: Le contexte implicite de _createPaneest l'instance. Testabilité de l'extérieur.
  • Inconvénients: exposer la fonction d'assistance sur l'instance.

Option 4: les fonctions d'assistance comme arguments

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

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

})(function createPane () {
   // same logic as last createPane
});
  • Avantages: createPane n'est pas publié sur l'instance. Les fonctions d'assistance n'ont pas accès les unes aux autres.
  • Inconvénients: lisibilité et testabilité inférieures; Le test de cet assistant doit avoir lieu dans le cadre de l'initialisation.
TaylorMac
la source

Réponses:

4

Le premier JavaScript n'a pas de classes .

Deuxièmement, votre troisième option me semble plus rationnelle, mais elle dépend aussi fortement de vos besoins. De plus, vous ne devriez pas trop vous inquiéter d'exposer la fonction d'assistance. Les avantages de la solution me justifient totalement le compromis.

Troisièmement, votre temps en tant que développeur est précieux; Ne rendez pas les tâches triviales difficiles à mettre en œuvre, longues et plus sensibles aux erreurs humaines. La simplicité du code source est une grande fonctionnalité en soi.

Mahdi
la source
1
Merci Mahdi. Je suis un utilisateur JavaScript de longue date et oui, c'est la raison pour laquelle j'ai écrit "classe" entre guillemets. Bien que la terminologie soit trompeuse, et de nombreuses organisations professionnelles appellent les fonctions de constructeur de JavaScript des classes. developer.mozilla.org/en-US/docs/Web/JavaScript/…
TaylorMac
Et merci pour la suggestion sur la simplicité. Ma question porte davantage sur la portée que sur l'accessibilité. Strict vs lâche.
TaylorMac
@TaylorMac Vous êtes les bienvenus, j'espère que cela vous aidera.
Mahdi
@Mahdi, currenlty Javscript a des classes.
Menai Ala Eddine
1

La statique appartient à la fonction IMO, dans votre cas, vous avez une statique privée, donc ...

Panes._createPane=function(pane){}
marque
la source