【问题标题】:For loop based on condition check基于条件检查的for循环
【发布时间】:2014-09-12 03:24:29
【问题描述】:

我正在寻找编写以下代码的最佳方法。

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 写的。

【问题讨论】:

  • 你想要的是一个所谓的“子程序”或“函数”。
  • 任何时候你在复制代码,你都在养成一个坏习惯。如果在多个地方需要某些东西,它应该成为一个单独的功能。这称为“封装”。您要复制 600 行的事实让我认为有几个机会可以更好地封装您缺少的代码。
  • 一个子程序,从两个地方调用。

标签: if-statement for-loop conditional


【解决方案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" 就像“啊,我怎么没想到”,或者“啊,我的眼睛!”?
  • 后者。然而,再想一想,编译器可能会优化你的索引,但仍然如此。
  • 感谢 tobias_k...在循环外有太多变量并且创建新函数需要大量工作的情况下,您的答案将最有效。当对外部变量的依赖性不大时,按照小册子的建议创建一个子例程将是一种很好的方法。
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多