65 votes

Pourquoi les instructions "continue" sont-elles mauvaises en JavaScript ?

Dans le livre Javascript : Les bons côtés de Douglas Crockford, c'est tout ce que l'auteur a à dire sur la déclaration continue :

El continue saute au début de la boucle. Je n'ai jamais vu un morceau de code qui n'ait pas été amélioré en le remaniant pour supprimer l'instruction continue déclaration.

Ça me perturbe vraiment. Je sais que Crockford a des opinions très tranchées sur JavaScript, mais cela me semble tout à fait faux.

Tout d'abord, continue fait plus que simplement sauter au sommet d'une boucle. Par défaut, il passe également à l'itération suivante. L'affirmation de Crockford n'est-elle donc pas une information complètement fausse ?

Plus important encore, je ne comprends pas entièrement pourquoi continue serait même considéré comme mauvais. Ce post fournit ce qui semble être l'hypothèse générale : Pourquoi continuer à l'intérieur d'une boucle est une mauvaise idée ?

Bien que je comprenne comment continue peut rendre le code difficile à lire dans certains cas, je pense qu'il est tout aussi probable qu'il puisse rendre le code plus lisible. Par exemple :

var someArray=['blah',5,'stuff',7];
for(var i=0;i<someArray.length;i++){
    if(typeof someArray[i]==='number'){
        for(var j=0;j<someArray[i];j++){
            console.log(j);
        }
    }
}

Cela pourrait être refactorisé en :

var someArray=['blah',5,'stuff',7];
for(var i=0;i<someArray.length;i++){
    if(typeof someArray[i]!=='number'){
        continue;
    }
    for(var j=0;j<someArray[i];j++){
        console.log(j);
    }
}

continue n'est pas particulièrement bénéfique dans cet exemple spécifique, mais il démontre le fait qu'il réduit la profondeur d'imbrication. Dans un code plus complexe, cela peut potentiellement améliorer la lisibilité.

Crockford ne fournit aucune explication quant à la raison pour laquelle continue ne devrait pas être utilisé. Y a-t-il une signification plus profonde derrière cette opinion qui m'échappe ?

0 votes

Le mot-clé continue est un outil - utilisez-le lorsque c'est possible. Parfois c'est nécessaire, la plupart du temps ça ne l'est pas. La seule fois où c'est mauvais, c'est lorsque vous n'avez pas besoin de l'utiliser mais que vous êtes trop paresseux ou trop négligent pour le faire autrement.

0 votes

J'ai eu le même sentiment et c'est pourquoi j'ai fait mon poste . Ce qui m'a aidé est de penser au mot hop lors de l'utilisation des déclarations de continuation. Je pense que M. Crawford a mal choisi son mot lors de la conception du langage :P Surtout que hop peut appliquer la logique 'continue' derrière. Si vous sautez par-dessus quelque chose, vous continuez généralement aussi. Pensez aux coureurs de marathon comme une bonne analogie.

6 votes

"Mr. Crawford" n'a pas conçu la langue.

74voto

egrunin Points 15356

Cette déclaration est ridicule. continue peut être abusé, mais il est souvent aide la lisibilité.

Utilisation typique :

for (somecondition)
{
    if (!firsttest) continue;

    some_provisional_work_that_is_almost_always_needed();

    if (!further_tests()) continue;

    do_expensive_operation();
}

L'objectif est d'éviter le code "lasagna", où les conditionnels sont profondément imbriqués.

Modifié pour ajouter :

Oui, c'est finalement subjectif. Voici ma métrique pour décider.

Modifié une dernière fois :

Cet exemple est trop simple, bien sûr, et vous pouvez toujours remplacer les conditionnels imbriqués par des appels de fonction. Mais dans ce cas, vous devrez peut-être passer des données par référence dans les fonctions imbriquées, ce qui peut créer des problèmes de refactoring au moins aussi graves que ceux que vous essayez d'éviter.

0 votes

J'ajouterais également que la lisibilité est subjective et que si la plupart des gens semblent apprécier l'utilisation de continue, d'autres peuvent ne pas l'apprécier. Pour la même raison, les gens détestent les gotos, qui ne sont pas intrinsèquement mauvais (seul l'abus de gotos est mauvais).

0 votes

Voir mon billet aquí . Je pense que le choix des mots est juste mauvais, je pense hop aurait dû être un meilleur mot utilisé. Mais c'est trop tard maintenant !

0 votes

Utilisation de continue permet également de lire le code plus dans un fonctionnel par exemple : for(a in b) { if (condition1) continue; if (condition2) continue; doSomething(); } est similaire à b.filter(condition1).filter(condition2).forEach(a => ...);

7voto

jJ' Points 1514

Je suis personnellement de l'autre côté que la majorité ici. Le problème ne vient généralement pas de l'exposé continue mais avec des modèles plus profondément imbriqués, où les chemins de code possibles peuvent devenir difficiles à voir.

Mais même votre exemple avec un continue ne montre pas une amélioration qui, à mon avis, est justifiable. D'après mon expérience, quelques continue Les déclarations sont un cauchemar à refactoriser plus tard (même pour les langages statiques mieux adaptés à la refactorisation automatisée comme Java, surtout lorsque quelqu'un y met plus tard break aussi).

J'ajouterai donc un commentaire à la citation que vous avez faite :

Refactoring pour supprimer continue augmente votre capacité de réingénierie.

Et les boucles internes sont vraiment de bons candidats pour, par exemple. fonction d'extraction . Un tel remaniement est effectué lorsque la boucle interne devient complexe, puis continue peut le rendre douloureux.

Ce sont mes opinions honnêtes après avoir travaillé professionnellement sur des projets JavaScript en équipe, les règles dont parle Douglas Crockford montrent vraiment leurs mérites.

5 votes

Je ne suis pas sûr de comprendre ce que vous voulez dire. Pourriez-vous donner un exemple où continue deviendra un "cauchemar à remanier" ? Par ailleurs, qu'entendez-vous par "fonction d'extraction" ? S'agit-il d'un modèle de conception ?

2 votes

"L'extraction d'une fonction (ou d'une méthode) est une technique de refactoring permettant d'extraire une partie du corps d'une fonction vers une nouvelle fonction distincte. Même le code simple dans une autre réponse ici avec 2 instructions continue devrait être réécrit (pour se débarrasser des instructions continue) afin de créer une nouvelle fonction à partir du corps de la boucle for. Lorsque vous obtenez des corps plus grands avec plus d'instructions continues imbriquées, il faut beaucoup de temps pour nettoyer votre code.

7voto

Tom Lucas Points 66

Douglas Crockford est peut-être de cet avis parce qu'il ne croit pas à l'affectation au sein d'un conditionnel. En fait, son programme JSlint ne vous permet même pas de le faire, même si Javascript le fait. Il n'écrirait jamais :

Exemple 1

while (rec = getrec())
{   
    if (condition1(rec))
        continue;

    doSomething(rec);
}

mais, je suppose qu'il serait écrire quelque chose comme :

Exemple 2

rec = getrec();

while (rec)
{   
    if (!condition(rec))
        doSomething(rec);

    rec = getrec();
}

Les deux fonctionnent, mais si vous mélangez accidentellement ces styles, vous obtenez une boucle infinie :

Exemple 3

rec = getrec();

while (rec)
{   
    if (condition1(rec))
        continue;

    rec = getrec();
}

Ça pourrait être une partie de la raison pour laquelle il n'aime pas continuer.

0 votes

Vous avez peut-être raison, mais je crois qu'il s'oppose aussi généralement à while les boucles en premier lieu.

4 votes

@twiz : Mon point de vue s'applique à for boucles et do les boucles aussi. Il croit sûrement en un peu de une sorte de boucle !

0 votes

rec = getrec(); apparaît deux fois, violant ainsi le principe "Don't Repeat Yourself".

2voto

Travis J Points 28588

Continue est un outil extrêmement utile pour économiser des cycles de calcul dans les algorithmes. Bien sûr, il peut être mal utilisé, mais il en va de même pour tous les autres mots-clés ou approches. Lorsque l'on s'efforce d'obtenir des performances, il peut être utile d'adopter une approche inverse de la divergence des chemins avec une instruction conditionnelle. Un continue peut faciliter l'inverse en permettant de sauter les chemins les moins efficaces lorsque cela est possible.

1voto

B-RiZzY Points 135

Personnellement, je n'ai jamais entendu parler d'une mauvaise utilisation de l'instruction continue. Il est vrai qu'elle pourrait (la plupart du temps) être facilement évitée, mais il n'y a pas de raison de no l'utiliser. Je trouve que les boucles peuvent être beaucoup plus propres et plus lisibles avec des instructions continues en place.

0 votes

C'est tellement vrai. Pour ajouter à votre réponse, le transpilateur ajoute en interne l'équivalent d'un continue à la fin de chaque boucle dans l'assemblage généré. En réalité, non seulement les instructions continue ne sont pas mauvaises, mais elles sont en fait très bonnes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X