Pet*_*ter 7 c while-loop nested-loops
我正在做一些功课,想知道是否存在太多嵌套while循环的东西.嵌套几个while循环有缺点吗?如果是这样,我将如何重构下面的代码片段?
下面是一次读取一行文件的代码,解析由某些定义的分隔符分隔的字段,并在打印到控制台之前删除前导空格.
// Read the file one line at a time
while (fgets(lineStr, MAXLINELENGTH, fp) != NULL)
{
charPtr = strtok(lineStr, DELIMITERS);
// Loop until line is parsed
while (charPtr != NULL)
{
// Skip past leading whitespace
while (isspace(*charPtr))
charPtr++;
puts(charPtr);
charPtr = strtok(NULL, DELIMITERS);
}
}
Run Code Online (Sandbox Code Playgroud)
这确实是一个相当主观的话题.在我看来,三个嵌套的while循环没有任何根本性的错误,但是你达到了可接受的极限.如果您要添加一个或两个更多级别的嵌套,那么在我看来,您将跨越合理的范围以期望读者理解.人类大脑在任何一个时间点都只能处理如此多的复杂性.
根据我的观点,有些人会争辩说,函数中嵌套的级别不应超过一级,并且函数不应包含超过10行代码.反驳的论点是,这样的政策可能导致更加分散,不相交的代码.我的经验法则是,如果你不能为一大块代码想出一个好的函数名,那么也许那段代码实际上不是单独作为一个函数.
看看你可以打破这个功能的方法,有几个明显的选择.
while为单独的函数.提取的函数将处理单行.这很容易命名和清楚阅读.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);
Run Code Online (Sandbox Code Playgroud)
请注意,提取的方法的重构和命名使得注释有点多余,我删除了它们.另一个好的经验法则是,如果你需要过多地评论代码,那么也许它还没有得到很好的考虑.
最终,确实没有硬性和快速的规则,而是归结为判断和个人偏好.在我看来,问题中的代码非常清晰可读,但在我看来,重构版本更加清晰.
免责声明:我对代码的正确性或其他方面不做任何评论.我只是忽略了那个方面.