gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:08:57 25 4
gpt4 key购买 nike

我正在做一些作业,想知道是否有太多嵌套的 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);
}
}

最佳答案

这确实是一个相当主观的话题。在我看来,三个嵌套的 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);

请注意,提取方法的重构和命名使注释有点多余,我将其删除。另一个好的经验法则是,如果您需要过多地注释代码,那么它可能还没有得到很好的分解。

归根结底,确实没有硬性规定,这取决于判断和个人喜好。在我看来,问题中的代码非常清晰易读,但我认为重构后的版本更清晰一些。

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

关于c - 嵌套很多while循环有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com