これは実際にはかなり主観的なトピックです。私の見解では、3つのネストされたwhileループに根本的な問題はありませんが、許容範囲の限界に達しています。ネストのレベルをさらに1つまたは2つ追加すると、読者が理解することを期待するのに合理的な境界を越えると思います。人間の脳は、ある時点で非常に多くの複雑さを処理することしかできません。
私の意見に反して、関数には1レベル以下のネストが必要であり、関数には約10行を超えるコードが含まれていてはならないと主張する人もいます。反対の議論は、そのようなポリシーはより断片化された、ばらばらのコードをもたらす可能性があるということです。私の親指のルールは、コードのチャンクに適した関数名を思いつかない場合、おそらくそのコードのチャンクは実際には関数として独立することを意図していないということです。
この機能を分割する方法を見ると、いくつかの明らかなオプションがあります。
- 最も外側の本体を
while
別の関数に抽出します。その抽出された関数は1行を処理します。名前を付けて読みやすくするのは簡単です。
while
空白をスキップするループを別の関数に抽出します。これも名前を付けるのが簡単で、コードが読みやすくなります。抽出された関数の名前によって空白が不要になるため、空白のコメントを削除します。それはおそらくやる価値があります。
これらのアイデアを適用した場合、コードは次のようになります。
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);
抽出されたメソッドのリファクタリングと名前付けにより、コメントが少し不要になり、削除したことに注意してください。もう1つの経験則は、コードにコメントを付けすぎる必要がある場合、おそらくまだ十分に因数分解されていないということです。
結局のところ、厳格で迅速なルールは実際にはなく、それは判断と個人的な好みに帰着します。私の見解では、質問のコードは非常に明確で読みやすいですが、リファクタリングされたバージョンは私の見解では少し明確です。
免責事項:コードの正確性やその他の点についてはコメントしません。私は単にその側面を無視しました。