Est-ce un si avec un bon modèle continue pour empêcher la nidification excessive tout en itérer sur les propriétés en Javascript?

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

Question

J'utilise normalement ce modèle pour itérer sur les propriétés de l'objet:

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

Je ne aime pas cette indentation excessive et, récemment, il a été souligné pour moi que je pouvais me débarrasser en faisant ceci:

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

   ...
}

J'aime parce qu'il ne présente pas le niveau supplémentaire de retrait. Est-ce bien de modèle, ou y at-il de meilleures façons?

Était-ce utile?

La solution

Personnellement, je préfère:

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

Il n'y a pas de niveau supplémentaire de retrait parce for, if, etc. prendra la déclaration suivante si vous laissez les accolades. Depuis que nous avons mis tout notre code à l'intérieur du bloc if hasOwnProperty il fait des accolades pour l'instruction for inutile.

Pour l'essentiel, il est équivalent à:

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

Autres conseils

Syntaxiquement je préférerais quelque chose comme ça

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
}

a l'air bien, mais il comporte deux boucles sur le même objet, pas assez sage performance.

L'autre façon de le faire est fonctionnelllement

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
});

Une seule boucle, mais une fonction est appelée à chaque itération, ce qui est une grande performance sage, mais mieux que la dernière solution. Notez qu'il aplatit également la valeur de this, mais vous pouvez passer cette valeur explicitement comme le 3ème argument optionnel.

Juste quelques solutions de rechange. La façon dont vous le faites, et la façon expliquée par Daniel est très bien, et sans compromis de performance.

En outre, je voudrais souligner que vous ne faites pas Vous pour indenter votre code pour chaque accolade ...

L'un des facteurs dépend si vous écoutez Douglas Crockford. Dans son livre, JavaScript. The Good Parts, il grumeaux continue avec le mauvais pièces

« Je n'ai jamais vu un morceau de code qui n'a pas été amélioré par la refactorisation pour enlever la déclaration continuer. » - Douglas Crockford, JavaScript: The Good Parts

Tim bas mentionné dans son commentaire, Crockford donne aucune raison dans le livre pour expliquer pourquoi continue doit être évité. Mais sur son site dit-il, « Il tend à obscurcir le flux de contrôle la fonction." Je ne mentionne que l'avis de Crockford puisque beaucoup le considèrent comme une autorité.

Personnellement, je ne vois pas de problème avec la façon dont vous avez votre boucle avons écrit, d'autant plus que l'continue apparaît tout en haut où il ne sera pas négligé facilement. Travaillez-vous avec une équipe de développeurs? Est-ce qu'ils ont une bonne compréhension de ce que fait continue? Avez-vous un congrès de code document qui parle de la façon de gérer l'imbrication profonde des états?

Mcconnel:

  

Une boucle avec de nombreuses pauses peut indiquer   pensée claire sur la structure   de la boucle ou de son rôle dans la   le code environnant. pauses excessives   soulève indique souvent que la boucle   pourrait être plus clairement exprimé en   série de boucles. Utilisation de pause   élimine la possibilité de traiter   une boucle comme une boîte noire. un contrôle   la condition de sortie de boucle avec une   déclaration pour simplifier vos boucles.   forces « break » la personne qui lit votre   Code à l'intérieur de regard pour comprendre la   le contrôle de la boucle, ce qui rend le plus en boucle   difficile à comprendre.

Dijkstra:

  

caractéristiques comme la rupture ont tendance à sabotage   les avantages de la structure   la programmation, et d'empêcher la   programmeur de comprendre la   programme en tant que composition de   unités indépendantes

Les boucles avec continuer peut être pris en compte dans cette forme et donc la boucle peut être traitée comme une boîte noire. Crawford est faux. Les pauses odeur, mais toujours est bon.

une analyse plus poussée

: http://sites.google.com/site / dustingetz / dev / pause-et continuer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top