对可怕的While(True)循环进行最佳重构

Jef*_*her 11 refactoring loops while-loop

如果像我一样,你在一个While(True)循环的位置颤抖,那么你也必须经过长时间的努力思考重构它的最佳方法.我已经看到了几种不同的实现,没有一种比其他任何实现更好,例如timer和delegate组合.

那么你提出或看到重构可怕的While(True)循环的最佳方法是什么?

编辑:正如一些评论所提到的,我的意图是这个问题是一个"无限循环"重构,例如运行Windows风格的服务,其中唯一的停止条件是OnStop或致命异常.

fiz*_*zer 61

我的偏好是

start:

   // code goes here

goto start;
Run Code Online (Sandbox Code Playgroud)

这最清楚地表达了意图.祝你好运,超越你的编码标准.(想知道这将花费多少业力).

  • 意图是无条件分支开始.'goto'专门用于此目的.'while'支持条件分支.通过使用简并始终为真的条件调用它,并依靠编译器对其进行优化,除了表达你的意思之外,你是一个额外的步骤. (17认同)
  • 我投了票,因为我厌恶编码标准纳粹. (13认同)
  • 我投了票,因为我在大会上编程 (11认同)
  • @Amarghosh:如果你需要突破循环,那么它实际上并不是一个无限循环; 如果你正在使用`while(true)`来做这些事情你就是做错了什么. (9认同)
  • 这比"while(true)"循环更好地表达你的意图?另一方面,您没有提到您的解决方案的缺点.所以是的,总而言之,这是一个非常糟糕的代码. (4认同)
  • 至于缺点,没有技术问题.如果你需要一个范围,请加入一些支撑.如果不需要,请不要.(假设C或C++ - OP未指定语言). (3认同)
  • 我投票赞成,因为有时goto *是*可以接受的! (2认同)
  • 你需要另一个'goto`来摆脱循环......变得复杂? (2认同)
  • `start:... goto start;`与`while(1){...}`稍有不同。在后者中,“ break;”退出循环,而在前者中,“ break;”退出父循环(或父开关/情况)。 (2认同)

art*_*r02 24

我们真的需要在(真)循环时重构吗?有时它是一个编码标准,大多数开发人员已经习惯了这种结构.如果你必须仔细思考如何重构这段代码,你确定重构它是一个好主意吗?

Goto曾经是编码标准中的黑羊.我遇到了算法,其中goto使代码更具可读性和更短.有时它不值得重构(或更好地使用goto).

另一方面,你可以避免大多数情况下(真实).


Kon*_*lph 22

有什么可怕的呢?尝试找到一个常见的中断条件并将其重构为循环的头部.如果这不可能 - 很好.

  • 或者重构,所以它最终并利用"do while". (4认同)

Jim*_*son 14

当我遇到一个while(true)循环时,它告诉我

  1. 在循环的顶部(或底部)不容易测试断裂条件,
    • 有多个休息条件,
    • 或者以前的程序员太懒了,无法正确地考虑循环.

1和2意味着你可以坚持同时(真实).(我使用for(;;),但在我看来,这是一种风格.)我还有另一张海报,为什么害怕这个?我害怕弯曲的循环,跳过篮球,让循环滚动"正常".


Jon*_*n B 12

将True替换为您将用于突破循环的条件.

对于服务或后台线程,您可以使用:

volatile bool m_shutdown = false;
void Run()
{
    while (!m_shutdown)
    { ... }
}
Run Code Online (Sandbox Code Playgroud)

  • 有时,人们为服务执行此操作,其中执行意味着无限期地继续,并且仅在 OnStop 或异常时中断。所以没有条件。 (2认同)

Ken*_*Ray 11

为什么要重构?关于这个结构有什么"可怕"?它被广泛使用,并且被很好地理解.

如果没有损坏,请不要修理它.


S.L*_*ott 7

"永远运行"的情况有时是更大的状态机的一部分.许多嵌入式设备(具有永久运行循环)并不真正永远运行.它们通常具有多种操作模式,并将在这些模式之间进行排序

当我们制造热泵控制器时,有一种电源自检(POST)模式可以运行一段时间.然后有一个初步的环境采集模式,直到我们找出所有的区域和恒温器以及什么不是.

一些工程师声称,接下来的是"永远运行"循环.事实并非那么简单.它实际上是几种翻转和翻转的操作模式.有加热,解冻,冷却,空转和其他东西.

我倾向于将"永远"循环视为一种操作模式 - 未来某些时候可能还有其他操作模式.

someMode= True
while someMode:
    try:
        ... do stuff ...
    except SomeException, e:
        log.exception( e )
        # will keep running
    except OtherException, e:
        log.info( "stopping now" )
        someMode= False
Run Code Online (Sandbox Code Playgroud)

在某些情况下,没有我们到目前为止看到设置someModeFalse.但我喜欢假装某个未来版本会有模式改变.


And*_*son 7

#define ever 1
for (;ever;)
Run Code Online (Sandbox Code Playgroud)

嗯,就这样离开吧,虽然(真实)可能会像你要得到的那样清晰......

  • 如果我们要去那个丑陋,为什么不"#define FOREVER while(1)"或类似的东西:) (6认同)

Kei*_*las 5

错误,要重构.....

  • 用无限递归替换无限循环:-)

好吧,如果你有一种支持 Tail 调用的语言......