基于条件检查的for循环

4
我正在寻找编写以下代码的最佳方法。
if (condition == true)
for (i = 0; i < 200; i++)
{
/// 600 lines of code
}

else
for (i = 200; i > 0; i--)
{
/// same 600 lines of code as in above condition check
}

目前,我在两个循环中都复制了相同的代码。但是是否有一种方法可以进行检查,然后只出现一次代码?唯一取决于条件检查的是循环的工作方式。根据条件检查,我必须向前或向后移动循环,并且不想将相同的600行代码粘贴两次。我正在使用C语言编写此代码。


你需要的是一个“子程序”或“函数”。 - pamphlet
每当你复制代码时,你就养成了一个不好的习惯。如果某个东西在多个地方都需要使用,它应该变成一个单独的函数。这就是所谓的“封装”。你复制的600行代码让我觉得你错过了几个更好的封装代码的机会。 - pamphlet
1
一个子程序,在两个地方被调用。 - pamphlet
1个回答

1

不要使用两个带有稍微不同循环变量的循环,你可以根据条件修改循环变量,使其从0到200或从200到0进行计数。

for (iteration = 0; iteration < max; iteration++)
{
    index = (condition == true)  ?  iteration  :  max-iteration;
    //  600 lines of code, using index
}

你可能想要添加一条评论,这样其他人(以及你自己)就知道这个代码的作用。

但是,即使如此,你也应该尝试将那600行代码重构为一个单独的方法--或者更准确地说,拆分成几个方法,每个方法处理一方面的这些600行代码。作为一个经验法则:i)无论是600行还是只有10行,每当你有重复的代码时,尝试将其制作成一个方法;ii)每当你有一个非常长的代码块,即使它并没有多次重复,也尝试将其拆分成几个方法。这将使代码更加自我描述,并且更容易维护。

这可能并不总是容易的,例如,如果这些600行访问和修改了许多在循环外声明的变量,但是再次,这本身可能是设计上的另一个缺陷...


@Quentin,“Argh”是指“Argh,我为什么没有想到这个”,还是指“Argh,我的眼睛!”? - tobias_k
然而,经过仔细考虑,编译器可能会优化掉你的索引操作,但是这仍然是后一种方法。 - Quentin
感谢 tobias_k 的回答,它在我有太多循环外变量且创建新函数需要大量工作的情况下最为有效。当对外部变量依赖不大时,按照 pamphlet 建议创建子程序是一种简洁的方法。 - marc1886

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接