如果像我一样,你在一个While(True)循环的位置颤抖,那么你也必须经过长时间的努力思考重构它的最佳方法.我已经看到了几种不同的实现,没有一种比其他任何实现更好,例如timer和delegate组合.
那么你提出或看到重构可怕的While(True)循环的最佳方法是什么?
编辑:正如一些评论所提到的,我的意图是这个问题是一个"无限循环"重构,例如运行Windows风格的服务,其中唯一的停止条件是OnStop或致命异常.
我的偏好是
start: // code goes here goto start;
这最清楚地表达了意图.祝你好运,超越你的编码标准.(想知道这将花费多少业力).
我们真的需要在(真)循环时重构吗?有时它是一个编码标准,大多数开发人员已经习惯了这种结构.如果你必须仔细思考如何重构这段代码,你确定重构它是一个好主意吗?
Goto曾经是编码标准中的黑羊.我遇到了算法,其中goto使代码更具可读性和更短.有时它不值得重构(或更好地使用goto).
另一方面,你可以避免在大多数情况下(真实).
有什么可怕的呢?尝试找到一个常见的中断条件并将其重构为循环的头部.如果这不可能 - 很好.
当我遇到一个while(true)循环时,它告诉我
在循环的顶部(或底部)不容易测试断裂条件,
有多个休息条件,
或者以前的程序员太懒了,无法正确地考虑循环.
1和2意味着你可以坚持同时(真实).(我使用for(;;)
,但在我看来,这是一种风格.)我还有另一张海报,为什么害怕这个?我害怕弯曲的循环,跳过篮球,让循环滚动"正常".
将True替换为您将用于突破循环的条件.
对于服务或后台线程,您可以使用:
volatile bool m_shutdown = false; void Run() { while (!m_shutdown) { ... } }
为什么要重构?关于这个结构有什么"可怕"?它被广泛使用,并且被很好地理解.
如果没有损坏,请不要修理它.
"永远运行"的情况有时是更大的状态机的一部分.许多嵌入式设备(具有永久运行循环)并不真正永远运行.它们通常具有多种操作模式,并将在这些模式之间进行排序
当我们制造热泵控制器时,有一种电源自检(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
在某些情况下,没有我们到目前为止看到设置someMode
到False
.但我喜欢假装某个未来版本会有模式改变.
#define ever 1 for (;ever;)
?
嗯,就这样离开吧,虽然(真实)可能会像你要得到的那样清晰......