嵌套很多while循环有问题吗?

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)

Dav*_*nan 7

这确实是一个相当主观的话题.在我看来,三个嵌套的while循环没有任何根本性的错误,但是你达到了可接受的极限.如果您要添加一个或两个更多级别的嵌套,那么在我看来,您将跨越合理的范围以期望读者理解.人类大脑在任何一个时间点都只能处理如此多的复杂性.

根据我的观点,有些人会争辩说,函数中嵌套的级别不应超过一级,并且函数不应包含超过10行代码.反驳的论点是,这样的政策可能导致更加分散,不相交的代码.我的经验法则是,如果你不能为一大块代码想出一个好的函数名,那么也许那段代码实际上不是单独作为一个函数.

看看你可以打破这个功能的方法,有几个明显的选择.

  1. 将最外层的主体提取while为单独的函数.提取的函数将处理单行.这很容易命名和清楚阅读.
  2. 提取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)

请注意,提取的方法的重构和命名使得注释有点多余,我删除了它们.另一个好的经验法则是,如果你需要过多地评论代码,那么也许它还没有得到很好的考虑.

最终,确实没有硬性和快速的规则,而是归结为判断和个人偏好.在我看来,问题中的代码非常清晰可读,但在我看来,重构版本更加清晰.

免责声明:我对代码的正确性或其他方面不做任何评论.我只是忽略了那个方面.

  • 我喜欢你的'没有名字,没有功能'的经验法则.显然只是一个指南,但它带来了一个好点 - 如果你无法描述函数会做什么,你可能不需要它作为一个函数! (2认同)