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.
createPane
non è 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.