OOP migliore in Javascript: più metodi o metodi con opzioni?

4

Diciamo che ho un oggetto del genere:

function Foo() {
  this.parser = new DataParser();
};

All'interno di Foo ho un metodo che fa qualcosa del genere:

Foo.prototype.getResponse = function(message, callback) {
  var payload = {data: message, type: 'normal'};
  var response = this.parser.parse(payload, function(data){
    callback(data);
  });
}

Ora, diciamo che da qualche altra parte devo chiamare foo.getResponse() . Il più delle volte voglio che venga eseguito proprio così, ma a volte ho bisogno che il formato di payload sia leggermente diverso - diciamo che devo specificare un tipo diverso.

Sarebbe meglio creare un metodo diverso per questo tipo di richiesta leggermente diverso, ad esempio ...

Foo.prototype.getSimilarResponse = function(message, callback) {
  var payload = {data: message, type: 'other'};
  var response = this.parser.parse(payload, function(data){
    callback(data);
  });
}

... o per prendere un'opzione su getReponse , in questo modo ...

Foo.prototype.getSimilarResponse = function(message, type, callback) {
  var payload = {data: message, type: type};
  var response = this.parser.parse(payload, function(data){
    callback(data);
  });
}

... o per fare qualcos'altro interamente?

L'uso di un'opzione type nell'esempio sopra è molto più DRY, ma non mi piace il modo in cui richiede al chiamante di conoscere il tipo di payload, che è davvero la preoccupazione di Foo e non devono essere esposti altrove.

Come consiglieresti di affrontare una situazione come quella sopra?

    
posta Andrew 16.03.2013 - 20:01
fonte

2 risposte

7

Suggerirei di passare l'argomento type 'optionally' in modo da ottenere una funzione come:

Foo.prototype.getSimilarResponse = function(message, type, callback) {
  if (typeof(type) === 'function') {
    callback = type;
    type = 'normal';
  }

  var payload = {data: message, type: type};
  var response = this.parser.parse(payload, function(data){
    callback(data);
  });
}

In questo modo, il tuo codice è ASCIUTTO e non devi preoccuparti del tipo se non lo desideri / necessario.

    
risposta data 16.03.2013 - 20:22
fonte
3

Vedi anche:

L'argomento delle opzioni

Questo è molto popolare nella comunità jQuery. È utile quando si hanno molte potenzialità di variazione che potrebbero generare una tonnellata di argomenti che si verificano sempre nelle funzionalità dell'interfaccia utente.

Mi piace anche per i normali costruttori di architetture di app di livello superiore. La facilità di frantumare oggetti come questi insieme è una delle ragioni per cui l'ereditarietà è molto meno affidata esclusivamente a JS.

Uno degli effetti collaterali più interessanti è il fattore di auto-documentazione di avere un elenco di cose facile da leggere che spiega quali sono tutte le opzioni variabili ed è davvero facile aggiungerne di nuove senza dover apportare modifiche ovunque ma la funzione / costruttore.

function Carousel(optionsIn){
    var options = {
        loopsItems:true, //first item follows last if true, or you're just stopped if false
        itemsPerScroll:'visible', //or a set number
        horizontal:true, //false is vertical
        contentInjection:false //static HTML if false, or a URL, or array of HTML
    };

    optionsIn = optionsIn || {};

    for(var x in optionsIn){
        options[x] = optionsIn[x];
    }
    //or $.extend(options, optionsIn) in jQuery land
    //behavior defined/switched on options here...

}

La parola chiave Argomenti

Un sacco di usi interessanti, specialmente per numeri variabili di argomenti.

function addThingsToSomeArray(){ //first arg is array, followed by any number of things
    var
        thingsLen = arguments.length-1,
        someArray = arguments[0]
    ;
    while(i--){
        someArray.unshift(arguments[i+1]);
    }
}

var someArray = [];
addThingsToSomeArray(someArray, function yay(){alert('yay');}, 'Bob', new Date(), Infinity);

Guarda e diventi verde con l'invidia, con linguaggi rigorosamente tipizzati che ti proteggono dall'imparare una lezione una volta, a volte, nel modo più difficile, per aiutarti a sbagliare con successo più e più volte.

    
risposta data 15.11.2013 - 19:29
fonte