Siendo la misma tarea doWork
, es probable que pueda definir una lista enlazada o vector de jobs
y pasar que como parámetro para doWork
, añadir la información correspondiente a esta lista dentro de la función, y sólo llamar undoWork
vez:
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;
De esta manera, su lógica no se volverá demasiado complicada, sin importar la combinación de trabajos para deshacer.
La ventaja, en comparación con la solución de @ twain249, es que la función decide si un trabajo se agrega a la lista o no, por lo que tiene un buen aislamiento, modularidad.
Por supuesto, puede combinar alguna forma de una estructura de datos interable con esto, a reducir aún más la cantidad de código repetitivo:
for(i=0; i < jobdata.size; i++) {
If(doWork(jobdata[i], &jobs)<0){
undowork(jobs);
return -1;
}
}
Como se puede notar, diseño de la estructura de datos juega un papel importante en diseño de algoritmo, generalmente mucho más importante de lo que normalmente se piensa.
Podría haber miles de trabajos, el código seguirá siendo de cuatro líneas.
posible duplicado de [Cómo evitar larga cadena de la libre (o elimina) después de cada comprobación de errores en C?] (Http://stackoverflow.com/questions/3339946/how-to-avoid-long- chain-of-frees-or-deletes-after-every-error-check-in-c) – karlphillip
Hay muchas buenas respuestas, pero lo mejor que puedo ofrecer es un comentario que las acompañe: cualquiera que sea el enfoque que tome, usted ' Siempre minimizaré la fealdad como esta y maximizaré la solidez, minimizando el número de pasos que tienen un caso de falla. Por ejemplo, precomputar la cantidad de memoria que necesitará y realizar un solo 'malloc' antes de comenzar, en lugar de asignar cantidades pequeñas en cada paso, puede hacer que muchas tareas con lógica compleja de salida de error sean simples. –