Code Smells en Programación Procedural/Imperativa
La programación procedural se enfoca en procedimientos o rutinas que operan sobre datos.
4.1. Smells en Programación Procedural
- Variables Globales: Uso excesivo de estado global
- Código Espagueti: Flujo de control complejo y difícil de seguir
- Bloques Anidados Profundos: Múltiples niveles de indentación
- Procedimientos Excesivamente Largos: Funciones de cientos de líneas
- Comentarios Explicativos: Código no autoexplicativo que requiere comentarios
4.2. Ejemplo: Código Espagueti y Variables Globales
C (con código espagueti):
#include <stdio.h>
int total = 0; // Variable global
int status = 0; // Variable global
void processData() {
int i = 0;
printf("Processing data\n");
while (i < 10) {
if (i % 2 == 0) {
total += i;
if (i > 5) {
status = 1;
if (total > 10) {
printf("Total exceeded 10\n");
break;
}
}
} else {
if (status == 0) {
total += 1;
} else {
total += 2;
if (total > 15) {
printf("Total exceeded 15\n");
break;
}
}
}
i++;
}
}
Refactorización
#include <stdio.h>
typedef struct {
int total;
int status;
} ProcessState;
int shouldAddOne(int status) {
return status == 0;
}
int processOddNumber(ProcessState* state) {
if (shouldAddOne(state->status)) {
state->total += 1;
} else {
state->total += 2;
if (state->total > 15) {
printf("Total exceeded 15\n");
return 0; // Signal to stop
}
}
return 1; // Continue processing
}
int processEvenNumber(ProcessState* state, int i) {
state->total += i;
if (i > 5) {
state->status = 1;
if (state->total > 10) {
printf("Total exceeded 10\n");
return 0; // Signal to stop
}
}
return 1; // Continue processing
}
ProcessState processData() {
ProcessState state = {0, 0};
int shouldContinue = 1;
printf("Processing data\n");
for (int i = 0; i < 10 && shouldContinue; i++) {
if (i % 2 == 0) {
shouldContinue = processEvenNumber(&state, i);
} else {
shouldContinue = processOddNumber(&state);
}
}
return state;
}