Manchmal haben Sie nur eine Liste von Operationen, die in einer festgelegten Reihenfolge ausgeführt werden müssen, wie bei der Implementierung eines Sequenzdiagramms. Was sind die besten Möglichkeiten, um die Code-Ausführungsreihenfolge zu erzwingen, um Refactoring zu verhindern, das durch Sequenzwechsel subtile Bugs einführt?Erzwingen Code-Ausführungssequenz
Angenommen, vorhandene Komponententests würden keine Probleme verursachen, die durch die Änderung der Reihenfolge der Ausführung von foo() und bar() im Folgenden verursacht werden.
Einige der Methoden, die ich je gesehen habe und verwendet:
Kommentare (verlässt sich auf die Menschen zu lesen & sie zu verstehen):
// do this
foo();
// then this
bar();Fließend Grammatik (um den Code mehr wie Englisch zu lesen und mutwilliges Refactoring zu vermeiden):
obj
.Do
.foo()
.Then
.bar();Zustandsvariablen & balking (zu erarbeiten):
foo_done=false;
if(foo()) foo_done=true;
if(foo_done) bar(); else throw_an_exception;Gruppierung logische Blöcke in Funktionen:
void foo_bar()
{
foo();
bar();
}
... und viele mehr zu hässlich zu beschreiben (Verschachtelung, Veranstaltungen, Anordnungen von Funktionszeigern, Namensgebung Funktionen Begin(), Mitte() und End() ...) .
Gibt es irgendwelche besser konstruierten Muster für diese Art von Sache?
Ich denke, ein konkreteres Beispiel könnte bessere Antworten hervorbringen. Wie streng ist die Reihenfolge, in der Dinge erledigt werden müssen? Wenn Sie immer einige Methoden in einer genauen Reihenfolge aufrufen müssen, ist dies ein Fehler, der mit einer void doEverything() falsch ist, die alle in der richtigen Reihenfolge aufruft. Wenn Sie Vorgänge in Ad-hoc-Aufträgen aufrufen müssen, welche Einschränkungen gibt es? Warum müssen sie in einer bestimmten Reihenfolge aufgerufen werden? operieren sie in einem gemeinsamen Staat?Haben sie Nebenwirkungen, die Sie nicht testen? –