C++ - Transaktion-Muster für Alles oder Nichts Arbeiten

Angenommen ich habe zwei Funktionen DoTaskA und DoTaskB—sowohl in der Lage zu werfen TaskException—mit Ihren entsprechenden "rollback" - Funktionen UndoTaskA und UndoTaskB. Was ist das beste Muster zu verwenden, so dass entweder beide gelingen oder scheitern beide?

Die besten, die ich jetzt haben, ist

bool is_task_a_done = false,
     is_task_b_done = false;

try {
    DoTaskA();
    is_task_a_done = true;

    DoTaskB();
    is_task_b_done = true;
} catch (TaskException &e) {
    //Before rethrowing, undo any partial work.
    if (is_task_b_done) {
        UndoTaskB();
    }
    if (is_task_a_done) {
        UndoTaskA();
    }
    throw;
}

Ich weiß, dass is_task_b_done unnötig ist, aber vielleicht gut zu zeigen code-Symmetrie im Fall fügen wir eine Dritte oder eine vierte Aufgabe später auf.

Nicht wie dieser code, da der Hilfs-Boolesche Variablen. Vielleicht gibt es etwas in der neuen C++11, die ich bin mir nicht bewusst, die kann code dieses mehr schön?

  • Wenn Sie im catch-block is_task_b_done ist immer false
  • Ich weiß, ich habe den Kommentar, dass es nur für den code Symmetrie im Fall fügen wir eine Dritte oder vierte Aufgabe.
  • Ist Ihre app mit multi-Threading? Hast du einen Blick auf RAII?
  • Für Einfachheit nehmen wir an, es ist nicht multithreaded. Suchen Sie ein design-Muster hier. Wie würde ich versuchen, diese mit RAII?
InformationsquelleAutor kirakun | 2012-06-11
Schreibe einen Kommentar