मान लीजिए के लिए पैटर्न मैं दो कार्यों DoTaskA
और DoTaskB
— उनकी संगत "रोलबैक" कार्यों UndoTaskA
और UndoTaskB
साथ TaskException
— फेंकने के दोनों सक्षम है। उपयोग करने के लिए सबसे अच्छा पैटर्न क्या है ताकि दोनों सफल हो या दोनों विफल हो जाएं?सी ++ लेन-देन की तरह सभी या कुछ भी नहीं काम
सबसे अच्छा मैं अब
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;
}
मुझे पता है कि is_task_b_done
मामले में हम एक तिहाई या बाद में एक चौथाई कार्य जोड़ने के कोड समरूपता को दिखाने के लिए अनावश्यक, लेकिन शायद अच्छा है।
सहायक बूलियन चर के कारण इस कोड को पसंद नहीं करते हैं। शायद नए सी ++ 11 में कुछ ऐसा है जो मुझे पता नहीं है, जो इसे और अधिक अच्छी तरह से कोड कर सकता है?
यदि आप कैच ब्लॉक के अंदर हैं, तो 'is_task_b_done' हमेशा' false' – SuperSaiyan
है, मुझे पता है, मैंने टिप्पणी जोड़ दी है कि अगर हम तीसरे या चौथे कार्य को जोड़ते हैं तो कोड समरूपता के लिए केवल यही है। – kirakun
क्या आपका ऐप बहु-थ्रेडेड है? क्या आपने [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) पर एक नज़र डाली? – dirkgently