Saltar al contenido principal

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;
}