Evita opt (opzioni) in javascript [closed]

1

Un sacco di framework, la maggior parte dei plugin jQuery usa il parametro "opzionale". Fondamentalmente un dizionario (o una struttura chiave / valore) con una serie di parametri aggiuntivi invece di inviare la funzione del parametro.

Ad esempio:

function (param1, param2, param3, param4, param4) {

  ...
}

Viene sostituito per:

function (opts) {
  opts.param1
  opts.param2, 
  opts.param3
  ...
}

L'IMO che utilizza opt equivale quasi a utilizzare molti parametri nel costruttore. Penso sia un po 'difficile mantenere le configurazioni (a volte) e capire cosa c'è dentro.

Forse è per non typecheck di javascript, e IDES normalmente non aiuta facilmente a sapere cosa c'è dentro opt.

Ma non so come migliorare la creazione di un oggetto configurabile.

Qualcuno conosce una soluzione migliore o come migliorare il design in queste situazioni?

    
posta vmariano 01.04.2015 - 00:04
fonte

3 risposte

5

Direi che dipende dalla lingua. In un linguaggio strongmente tipizzato come Java, passare a Map<String, Object> significa rischiare di usare il tipo sbagliato per un parametro.

Detto questo, ho visto che è stato usato in framework come ExtJS e, per alcune attività che richiedono molti parametri (come l'inizializzazione, la configurazione) ne vale la pena. Aiuta davvero, perché quando costruisci gli oggetti hai il nome del parametro proprio accanto al valore, invece di dover contare quale parametro si trova nella lista degli argomenti della funzione e contare quale parametro stai effettivamente usando.

Confronta questo codice

function createWindow({
  top: 10,
  right: 10,
  width: 100,
  height: 200,
  title: 'My title',
  text: 'My text',
  buttons: [button1, button2],
  borderStyle: myBorderStyle
});

a

function createWindow(
  10,
  10,
  100,
  200,
  'My title', /* I am sure it is the right order? or is text before title? */
  'My text',
  null, /* I do not need this param, or the next other 3*/
  null,
  null,
  null,
  [button1, button2],
  null,
  null,
  null,
  myBorderStyle /* This is the 13th or the 12th parameter? */
);

Quale è più facile da capire?

Inoltre, è possibile utilizzare il modello di builder per impostare i parametri nel dizionario, ad esempio

var conf = {}
setTop(conf, 10);
setRight(conf, 10);
...

sebbene IMO tu non stia migliorando la prima versione (e in realtà non la vedo molto usata).

Ora, per i linguaggi strongmente tipizzati, userei un ConfigurationClass , in cui ogni parametro è definito come un attributo e il suo tipo è definito, ma in JS c'è poco da fare poiché, se si scrive il nome dell'attributo sbagliato , il compilatore non te lo dirà.

    
risposta data 01.04.2015 - 00:28
fonte
2

Un modo per combattere la grande quantità di parametri è un pattern builder + interfaccia fluido.

Si consideri:

widget = makeWidget(100, 200)
         .withSize(384, 256)
         .withColors(foreground, background)
         .withBorder('solid', 'black', 1)
         .withDialogButtons('OK', 'Cancel', 'Help')

Questo approccio raggruppa insiemi di parametri correlati in modo che ogni set sia denominato e osservabile, che permetta di variare l'ordine e di omettere le parti in cui i valori predefiniti sono OK.

    
risposta data 01.04.2015 - 01:09
fonte
1

JavaScript non supporta i valori predefiniti dei parametri per le dichiarazioni di funzioni.

function foo(x) {
    console.log(x);
}
foo(); // outputs undefined

Dovresti aggiungere codice aggiuntivo per parametro per impostare il valore predefinito.

function foo(x) {
  if(typeof x === 'undefined') {
    x = 0;
  }
  console.log(x);
}
foo(); // outputs 0

Questo diventa un dolore quando ci sono un certo numero di parametri come function foo(param1,param2,param2) .

È possibile definire rapidamente valori predefiniti utilizzando un oggetto come parametri.

function foo(opts) {
   opts = $.extend({x:0,y:0,z:0},opts);
   console.log(opts.x);
}
foo(); // outputs 0

Questo è fondamentalmente il motivo per cui molte persone usano oggetti chiave / valore per mantenere i parametri.

    
risposta data 01.04.2015 - 01:47
fonte

Leggi altre domande sui tag