Funzione che modifica un argomento, dovrei restituire l'oggetto modificato?

7

Abbiamo una funzione che modifica un oggetto JS, aggiungendovi alcune proprietà personalizzate. La funzione non restituisce qualcosa

addTransaction: function (obj) {
     obj.transactionId = this.getTransactionId;
     obj.id = this.recordId;
},

Qualcuno ha affermato che preferisce che addTransaction restituisca obj .

Ecco cosa ho pensato

  • Se non restituisco nulla (e documento che l'oggetto verrà modificato), è abbastanza chiaro che l'oggetto verrà modificato, come se il nome fosse addTransactionToObj

  • Se voglio aggiungere un valore di ritorno, non dovrei modificare l'oggetto in arrivo, dovrei clonare l'oggetto dato, aggiungere le mie proprietà al clone e restituire il clone.

  • Avere un valore di ritorno che restituisce solo uno dei parametri (modificati) sembra sbagliato

Qualcuno ha una preferenza in questa materia?

    
posta Juan Mendes 10.04.2013 - 20:12
fonte

4 risposte

4

Ti permette di fare concatenare il metodo , che molte persone sentono migliorare la leggibilità. È un idioma comune molto in JavaScript, il che significa che molte persone se lo aspettano, specialmente se il resto della base di codice è simile. Il tuo secondo punto sulla clonazione dell'oggetto ha anche il merito, se usato per rendere il tuo oggetto immutabile . Quanto è vantaggioso dipende dalla tua specifica applicazione.

    
risposta data 10.04.2013 - 20:35
fonte
2

Prima di tutto, penso che questa funzione sia strana ... Voglio dire che mi aspettavo che addTransaction aggiungesse una transazione a this , non viceversa. Ma forse sono solo io (edit: apparentemente no). Se questo è davvero ciò che vuoi fare, ti suggerisco di leggere da "naming your function".

In secondo luogo, penso che il problema principale risieda nella parte "aggiungi" di "addTransaction". Per me, significa che un oggetto verrà modificato per avere una "transazione".

In terzo luogo, ci sono molti modi in cui puoi farlo. Puoi:

  • restituisce una copia, il che significa che l'oggetto originale è immutabile
  • restituisci l'oggetto a cui è collegata la transazione, quindi stai seguendo il paradigma di interfaccia fluente .
  • non restituisce nulla, l'oggetto è modificato

Non esiste un modo "migliore", basta essere coerenti e KISS quando si sceglie una determinata applicazione.

Assegnazione del nome alla funzione

Robert C. Martin's in ( Suggerimenti sui codici puliti sulle funzioni di denominazione ) afferma che il più piccolo l'ambito più preciso dovrebbe essere il nome della funzione. Suggerisco di nominarlo a qualcosa sulla falsariga di " attachTransactionIdAndRecordIdToObject " se vuoi mantenere entrambi i setter nella stessa funzione. Ancora una volta, se tu restituisci l'oggetto stesso o no è la tua scelta.

    
risposta data 10.04.2013 - 20:40
fonte
1

If I don't return anything, it's kind of clear that the object is going to be modified

Non necessariamente. Potrebbe essere un metodo che causa effetti collaterali, come un logger.

If I do want to add a return value, I shouldn't modify the incoming object, I should clone the given object, add my properties to the clone and return the clone.

In generale, sarei d'accordo. Ma restituire l'oggetto originale è una tecnica valida, specialmente se stai costruendo un'interfaccia Fluent Interface .

Come sottolinea Florian, un approccio migliore potrebbe essere quello di aggiungere la funzione all'oggetto stesso, come in DoSomethingToThis() .

    
risposta data 10.04.2013 - 20:34
fonte
0

Mi sono inventato qualcosa cercando di incorporare tutti i suggerimenti. Crea una classe con l'oggetto che stai per inviare con la richiesta AJAX.

function MyAjaxParams() {  
    this.obj = {};
}

/**
 * @param {MyDocument} doc
 */
MyAjaxParams.prototype.addTransaction = function(doc) {
     this.transactionId = doc.getTransactionId();
     this.id = this.getRecordId();
}

MyAjaxParams.prototype.getParamsObject = function() {
    return this.obj;
}

// Many other methods to insert all required AJAX parameters

Quindi il mio codice esistente avrebbe eseguito la seguente

MyDocument.prototype.save = function () {
    var ajaxParams = new MyAjaxParams();
    ajaxParams.addTransactionParams(this);
    ...
    Ext.Ajax.request.send({
      url: '/here/we/go',
      params: ajaxParams.getParamsObject()
    });
}
    
risposta data 10.04.2013 - 20:56
fonte

Leggi altre domande sui tag