Meilleur refactoring du redoutable While (True) boucle
Si, comme moi, vous tremblez à l'emplacement d'un While (True) en boucle, alors vous aussi, vous devez avoir longuement réfléchi sur la meilleure façon de refactoriser loin. J'ai vu plusieurs implémentations différentes, aucun vraiment mieux que tous les autres, tels que la minuterie & délégué combinaison.
Alors, quelle est la meilleure façon que vous avez trouvé ou vu de refactoriser le redoutable While (True) boucle?
Modifier: Comme certains commentaires mentionné, mon intention était pour répondre à cette question d'une "boucle infinie" refactoring, telles que l'exécution d'un Windows service de style où le seul arrêt des conditions OnStop ou une exception irrécupérable.
- Je devrais avoir rédigé cette meilleure, et de la pensée d'aller retour à faire, mais c'est un processus d'apprentissage continu, j'ai donc décidé de laisser la question est comme un rappel à moi-même. 🙂
- Si vous "effroi" while(true), vous devez être écrit très simpliste algorithmes. La plupart des algorithmes avancés nécessitent des boucles avec de multiples conditions de sortie. Le moyen le plus naturel de le faire est d'avoir un extérieur boucle infinie et puis de multiples conditions de sortie que sortir de la boucle. À l'aide De boucles ou de tout-des conditions de travail mieux quand vous n'avez qu'une seule sortie de la condition. Même si c'est le cas le plus fréquent, il n'est guère de l'universel de la situation.
Vous devez vous connecter pour publier un commentaire.
Avons-nous vraiment besoin de refactoriser while(true) boucles?
Parfois, c'est une norme de codage et la plupart des développeurs s'est habitué à cette structure. Si vous avez à réfléchir sur la façon de refactoriser ce code, vous êtes sûr que c'est une bonne idée de refactoriser le code?
Goto utilisé pour être un mouton noir dans les normes de codage. J'ai rencontré des algorithmes où goto fait le code plus lisible et plus courte. Parfois, il ne vaut pas le coup de revoir (ou de mieux utiliser goto).
D'autre part, vous pouvez éviter while(true) la plupart du temps.
Ma préférence serait
Ce la plupart exprime clairement l'intention. Bonne chance de l'obtenir au-delà de vos normes de codage. (Je me demande combien de karma, cela va me coûter).
while(true)
boucle? D'autre part, vous n'avez pas mentionné les inconvénients de votre solution. Donc, oui, dans l'ensemble, c'est assez merdique code.goto
pour sortir de la boucle... obtenir des complexes?while (true)
pour des choses telles que vous faites quelque chose de mal.start:...goto start;
est subtilement différent dewhile(1){...}
. Dans ce dernier,break;
sorties de la boucle alors que dans l'ancien,break;
sorties de la mère de la boucle (ou le parent/interrupteur cas).Ce qui est redoutable à ce sujet? Essayez de trouver une commune de la condition d'arrêt et de refactoriser le code pour être à la tête de la boucle. Si ce n'est pas possible d'amende.
Quand je rencontre un while(true) en boucle, qui me dit que soit
1 et 2 signifie que vous pourriez aussi bien le bâton avec while(true). (J'utilise
for(;;)
, mais c'est un style de chose à mon avis.) Je suis avec une autre affiche, pourquoi redoutez-ce? J'ai la trouille tortored boucles à sauter à travers des cerceaux pour obtenir la boucle roulé "correctement".Remplacer Vrai à la condition que vous alliez à utiliser pour sortir de la boucle.
Dans le cas d'un service ou d'un thread d'arrière-plan, vous pouvez utiliser:
Pourquoi refactoriser? Et ce qui est si "terrible" à propos de cette construction? Il est largement utilisé, et bien comprises.
Si ce n'est pas cassé, ne le répare pas.
La "pour toujours" de la situation est parfois partie d'un plus grand état de la machine. De nombreux appareils embarqués (avec run-pour toujours boucles) n'ont pas vraiment courir jamais. Ils ont souvent plusieurs modes de fonctionnement et la séquence entre ces modes.
Lorsque nous avons construit la pompe à chaleur contrôleurs, il y avait un power-on-self-test (POST) le mode qui a duré un peu de temps. Ensuite il y a une environnementale préliminaire mode de collecte, qui a couru jusqu'à ce que nous avons compris toutes les zones et les thermostats et ce-pas.
Certains ingénieurs ont prétendu que ce qui s'est passé ensuite a été le "run-pour toujours" de la boucle. Ce n'était pas vraiment aussi simple que cela. Il a été fait plusieurs modes de fonctionnement retournée et s'est affalé. Il y avait de chauffage et de dégivrage, et de refroidissement, et la marche au ralenti, et d'autres choses.
Ma préférence est pour traiter un "pour toujours" de la boucle aussi vraiment juste un mode de fonctionnement -- il peut y en avoir d'autres à un certain moment dans l'avenir.
Dans certaines circonstances, rien de ce que nous avons vu jusqu'à présent ensembles
someMode
àFalse
. Mais je tiens à faire semblant qu'il y aura un changement de mode dans une version future.?
Meh, il suffit de laisser la façon dont il est, while (true) est probablement aussi lisibles que vous allez obtenir..
euh, pour être un refactoring.....
bien, si vous avez un langage qui prend en charge les appels Tail....
Si vous souhaitez continuer indéfiniment jusqu'à ce qu'un totale de l'avortement de flux de programme, je ne vois rien de mal avec while (true). J'ai rencontré il y a peu dans un .NET service de collecte de données qui combine while (true) avec filetage.dormir pour se réveiller à chaque minute et sondage-la troisième partie de service de données pour de nouveaux rapports. J'ai considéré la refactorisation avec une minuterie et d'un délégué, mais en fin de compte décidé que c'était le plus simple et le plus facile à lire de la méthode. 9 fois sur 10 c'est une nette odeur de code, mais quand il n'y a pas de sortie de la condition, pourquoi rendre les choses plus difficiles?
Je n'ai pas l'esprit lorsque la boucle infinie est contenue à l'intérieur d'une fenêtre, et meurt avec la fenêtre.
Pense de la Hasselhoff la Récursivité.
Avertissement: Votre pile peut être débordement, dépend de la langue, de l'optimiseur et d'autres choses.