Là nhiệm vụ tương tự doWork
, có lẽ bạn có thể định nghĩa một danh sách liên kết hoặc vector của jobs
và thông qua đó như một tham số để doWork
, thêm các thông tin tương ứng với danh sách này bên trong hàm, và chỉ gọi undoWork
một lần:
If(doWork("A", &jobs)<0){
return -1;
}
If(doWork("B", &jobs)<0){
undoWork(jobs);
return -1;
}
If(doWork("C", &jobs)<0){
undoWork(jobs);
return -1;
}
return 0;
Bằng cách này, logic của bạn sẽ không trở nên quá phức tạp, bất kể kết hợp công việc sẽ được hoàn tác.
Lợi thế, so với giải pháp @ twain249, là chức năng quyết định xem một công việc có được thêm vào danh sách hay không, vì vậy bạn đã có sự cô lập, mô đun tốt đẹp.
Bạn có thể dĩ nhiên kết hợp một số hình thức của một cấu trúc dữ liệu interable với điều này, để tiếp tục giảm số lượng mã lặp đi lặp lại:
for(i=0; i < jobdata.size; i++) {
If(doWork(jobdata[i], &jobs)<0){
undowork(jobs);
return -1;
}
}
Như bạn có thể nhận thấy, thiết kế cấu trúc dữ liệu đóng một vai trò quan trọng trong việc thiết kế thuật toán, thường là một trong những quan trọng hơn nhiều so với một trong những thường nghĩ.
Có thể có hàng nghìn công việc, mã sẽ vẫn là bốn lớp lót.
có thể trùng lặp của [Cách tránh chuỗi dài miễn phí (hoặc xóa) sau mỗi lần kiểm tra lỗi trong C?] (Http://stackoverflow.com/questions/3339946/how-to-avoid-long- chain-of-frees-hoặc-deletes-after-every-error-check-in-c) – karlphillip
Có nhiều câu trả lời hay, nhưng điều tốt nhất tôi có thể đưa ra là bình luận để đi với họ: bất kỳ cách tiếp cận nào bạn thực hiện, bạn ' sẽ luôn luôn giảm thiểu sự xấu xí như thế này, và tối đa hóa độ mạnh mẽ, bằng cách giảm thiểu số lượng các bước có trường hợp lỗi. Ví dụ, precomputing số lượng bộ nhớ bạn sẽ cần và thực hiện một 'malloc' duy nhất trước khi bạn bắt đầu thay vì phân bổ số lượng nhỏ ở mỗi bước có thể làm cho nhiều nhiệm vụ phức tạp với logic lỗi đơn giản. –