同じタスクdoWork
であるため、リンクされたリストまたはベクトルを定義し、jobs
それをパラメータとして に渡しdoWork
、対応する情報を関数内のこのリストに追加し、undoWork
1 回だけ呼び出すことができます。
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;
このように、元に戻すジョブの組み合わせに関係なく、ロジックが過度に複雑になることはありません。
@ twain249のソリューションと比較した利点は、ジョブがリストに追加されるかどうかを関数が決定するため、優れた分離、モジュール性が得られることです。
もちろん、何らかの形式の相互利用可能なデータ構造をこれと組み合わせて、繰り返しコードの量をさらに減らすことができます。
for(i=0; i < jobdata.size; i++) {
If(doWork(jobdata[i], &jobs)<0){
undowork(jobs);
return -1;
}
}
お気づきのように、データ構造の設計は、アルゴリズムの設計において重要な役割を果たします。通常、その役割は、一般に考えられているよりもはるかに重要です。
何千ものジョブが存在する可能性がありますが、コードは 4 行のままです。