Esto es realmente un tema bastante subjetivo. En mi opinión, no hay nada fundamentalmente erróneo en tres bucles while anidados, pero está llegando al límite de aceptabilidad. Si agregara uno o dos niveles más de anidación, en mi opinión, cruzaría el límite de lo que es razonable esperar que el lector comprenda. El cerebro humano solo puede manejar tanta complejidad en cualquier punto del tiempo.
Algunas personas podrían argumentar, en contra de mi opinión, que no debería haber más de un nivel de anidación en una función, y que las funciones no deberían contener más de 10 líneas de código. El argumento contrario es que dicha política puede dar como resultado un código disjunto más fragmentado. Mi regla de oro es que si no se puede pensar en un buen nombre de función para un fragmento de código, entonces tal vez ese trozo de código no esté destinado a funcionar solo como una función.
En cuanto a las formas en que puede romper esta función, hay un par de opciones obvias.
- Extraiga el cuerpo del
while
más externo en una función separada. Esa función extraída procesaría una sola línea. Sería fácil de nombrar y claro para leer.
- Extraiga el lazo
while
que omite espacios en blanco en una función separada. Eso sería fácil de nombrar y haría que tu código sea más fácil de leer. Quitaría el comentario de espacio en blanco porque el nombre de la función extraída lo haría innecesario. Probablemente valga la pena hacerlo
Si aplicó estas ideas, entonces su código podría ser un poco como esto:
char* skipWhitespace(char* str)
{
while (isspace(*str))
str++;
return str;
}
void parseLine(char *lineStr)
{
charPtr = strtok(lineStr, DELIMITERS);
while (charPtr != NULL)
{
charPtr = skipWhitespace(charPtr);
puts(charPtr);
charPtr = strtok(NULL, DELIMITERS);
}
}
......
while (fgets(lineStr, MAXLINELENGTH, fp) != NULL)
parseLine(lineStr);
Tenga en cuenta que la refactorización y la denominación de métodos extraídos hace que los comentarios un poco superfluo y me los quitó. Otra buena regla empírica es que si necesita comentar un código demasiado, entonces quizás todavía no esté bien factorizado.
En última instancia, realmente no hay reglas duras y rápidas, y todo se reduce a juicio y preferencia personal. En mi opinión, el código en la pregunta es muy claro y legible, pero la versión refactorizada es un poco más clara, en mi opinión.
Descargo de responsabilidad: No hago ningún comentario sobre la corrección o no del código. Simplemente ignoré ese aspecto.
No, no hay problema en los bucles anidados. – pmg
Aunque, es posible que desee encapsular algunos de ellos en métodos que reflejen lo que están haciendo; el último se convierte en 'skipSpaces()', o algo así. –
si la entrada puede contener caracteres negativos (* con valores mayores que 127 *) es posible que desee convertir el argumento a 'isspace' para evitar un comportamiento indefinido:' isspace ((char sin signo) * charPtr) ' – pmg