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?
-
04-10-2019 - |
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?
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