È un caso con una continua un buon motivo per evitare la nidificazione eccessivo, mentre l'iterazione di immobili a JavaScript?

StackOverflow https://stackoverflow.com/questions/3765723

Domanda

Io di solito utilizzare questo modello per scorrere le proprietà degli oggetti:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
      ...
   }
}

Non mi piace questo rientro eccessivo e di recente è stato sottolineato a me che ho potuto sbarazzarsi di esso in questo modo:

for(var property in object) {
   if(!object.hasOwnProperty(property)) {
      continue;
   }

   ...
}

Mi piace questo perché non introduce l'ulteriore livello di indentazione. È questo il modello va bene, o ci sono modi migliori?

È stato utile?

Soluzione

Io personalmente preferisco:

for(var property in object) if(object.hasOwnProperty(property)) {
     ...
}

Non v'è alcun ulteriore livello di rientro perché for, if, ecc avrà l'istruzione successiva se si lascia fuori le parentesi graffe. Dal momento che abbiamo messo tutto il nostro codice all'interno del blocco if hasOwnProperty rende eventuali sostegni per l'istruzione for superfluo.

Essenzialmente è equivalente a:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
     ...
   } else {
      continue;
   }
}

Altri suggerimenti

Syntacticly Io preferirei qualcosa di simile

function own(obj) {
  var ownprops = {};
  for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;

  return ownprops;
}

for (var property in own(object)) {
 //code
}

Sembra bello, ma comporta due anelli per lo stesso oggetto, non abbastanza le prestazioni saggio.

L'altro modo per farlo è functionaly

function foreach(obj, func, thisp) {
  for (var prop in obj)
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}

foreach(object, function(val, key) {
  //code
});

Un solo ciclo, ma una funzione viene chiamata per ogni iterazione, che non è grande prestazione saggio, ma migliore di quello precedente soluzione. Si noti che clobbers anche il valore di this, ma si può passare che il valore in modo esplicito come il terzo argomento opzionale.

Solo alcune alternative. Il modo in cui si sta facendo, e il modo in cui ha spiegato da Daniel è bene, e senza compromessi di prestazioni.

Inoltre, vorrei sottolineare che non si sono di rientrare il codice per ogni singola parentesi graffa ...

Un fattore dipende dal fatto che si ascolta Douglas Crockford. Nel suo libro, JavaScript:. The Good Parts, ha grumi continue con il male parti

"Non ho mai visto un pezzo di codice che non è stata migliorata refactoring per rimuovere l'istruzione continue." - Douglas Crockford, JavaScript: le parti buone

Tim Giù di cui al suo commento, Crockford dà nessuna ragione nel libro per spiegare perché continue dovrebbe essere evitato. Ma su suo sito dice, "Si tende ad oscurare il flusso di controllo di la funzione." Cito solo l'opinione di Crockford dal momento che molti lo considerano un'autorità.

Personalmente non vedo alcun problema con il modo che avete codificato il ciclo, tanto più che il continue appare a destra in alto, dove non sarà facile essere trascurato. State lavorando con un team di sviluppatori? Hanno una buona comprensione di ciò continue fa? Avete una convention codice del documento che parla di come gestire in profondità di nidificazione di dichiarazioni?

McConnel:

  

Un ciclo con molte interruzioni può indicare   pensiero chiaro sulla struttura   del loop o il suo ruolo nella   codice circostante. pause eccessive   solleva spesso indica che il ciclo   potrebbe essere più chiaramente espresso in   serie di cicli. L'utilizzo di rottura   elimina la possibilità di trattare   un ciclo come una scatola nera. il controllo di un   condizione di uscita del loop con una sola   dichiarazione per semplificare i loop.   le forze di 'rompere' la persona che legge il tuo   Codice a guardare dentro per capire la   il controllo del ciclo, rendendo il ciclo più   difficile da capire.

Dijkstra:

  

caratteristiche come pausa tendono ad sabotaggio   i benefici della strutturati   la programmazione, e prevenire la   programmatore di comprendere il   programma come composizione di   unità indipendenti

Loops con Continua può essere preso in considerazione in questa forma e, quindi, il ciclo può essere trattato come una scatola nera. Crawford è sbagliato. Breaks odore, ma continuano è buono.

ulteriore analisi: http://sites.google.com/site / dustingetz / dev / break-e-continua

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top