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)
这最清楚地表达了意图.祝你好运,超越你的编码标准.(想知道这将花费多少业力).
art*_*r02 24
我们真的需要在(真)循环时重构吗?有时它是一个编码标准,大多数开发人员已经习惯了这种结构.如果你必须仔细思考如何重构这段代码,你确定重构它是一个好主意吗?
Goto曾经是编码标准中的黑羊.我遇到了算法,其中goto使代码更具可读性和更短.有时它不值得重构(或更好地使用goto).
另一方面,你可以避免在大多数情况下(真实).
Jim*_*son 14
当我遇到一个while(true)循环时,它告诉我
1和2意味着你可以坚持同时(真实).(我使用for(;;),但在我看来,这是一种风格.)我还有另一张海报,为什么害怕这个?我害怕弯曲的循环,跳过篮球,让循环滚动"正常".
Jon*_*n B 12
将True替换为您将用于突破循环的条件.
对于服务或后台线程,您可以使用:
volatile bool m_shutdown = false;
void Run()
{
while (!m_shutdown)
{ ... }
}
Run Code Online (Sandbox Code Playgroud)
"永远运行"的情况有时是更大的状态机的一部分.许多嵌入式设备(具有永久运行循环)并不真正永远运行.它们通常具有多种操作模式,并将在这些模式之间进行排序
当我们制造热泵控制器时,有一种电源自检(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)
在某些情况下,没有我们到目前为止看到设置someMode到False.但我喜欢假装某个未来版本会有模式改变.
#define ever 1
for (;ever;)
Run Code Online (Sandbox Code Playgroud)
?
嗯,就这样离开吧,虽然(真实)可能会像你要得到的那样清晰......