Parfois, vous n'avez qu'une liste d'opérations qui doivent être exécutées dans un ordre déterminé, comme lors de l'implémentation d'un diagramme de séquence. Quelles sont les meilleures façons d'appliquer l'ordre d'exécution du code, pour empêcher le refactoring d'introduire des bugs subtils à travers un changement de séquence?Application de la séquence d'exécution de code
Supposons que les tests unitaires existants n'attrapent aucun problème causé par le changement de l'ordre d'exécution de foo() et bar() dans ce qui suit.
Quelques-unes des méthodes que je l'ai vu et utilisé:
Commentaires (associant des personnes de lecture & leur compréhension):
// do this
foo();
// then this
bar();grammaire Courant (pour que le code soit plus proche de l'anglais et décourage le refactoring gratuit):
obj
.Do
.foo()
.Then
.bar();variables d'état & rechignant (préciser aussi):
foo_done=false;
if(foo()) foo_done=true;
if(foo_done) bar(); else throw_an_exception;Regroupement des blocs logiques en fonctions:
void foo_bar()
{
foo();
bar();
}
... et bien d'autres trop laid pour décrire (imbrication, les événements, les tableaux de pointeurs de fonction, les fonctions de nommage Begin(), Moyen() et End() ...) .
Y a-t-il des modèles mieux conçus pour faire ce genre de chose?
Je pense qu'un exemple plus spécifique pourrait susciter de meilleures réponses. Dans quelle mesure l'ordre dans lequel les choses doivent être faites est-il rigide? Si vous avez toujours besoin d'appeler certaines méthodes dans une séquence exacte, et ne pas le faire est une erreur ce qui ne va pas avec un void doEverything() qui les appelle toutes, dans le bon ordre. Si vous devez appeler des opérations dans des ordres ad hoc, quelles sont les contraintes? Pourquoi doivent-ils être appelés dans un ordre spécifique? fonctionnent-ils sur un état commun?ont-ils des effets secondaires, vous n'êtes pas un test unitaire? –