当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《对可怕的While(True)循环进行最佳重构》经验,为你挑选了8个好方法。

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

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

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



1> fizzer..:

我的偏好是

start:

   // code goes here

goto start;

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


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

2> artur02..:

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

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

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



3> Konrad Rudol..:

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


或者重构,所以它最终并利用"do while".

4> Jim Nelson..:

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

    在循环的顶部(或底部)不容易测试断裂条件,

    有多个休息条件,

    或者以前的程序员太懒了,无法正确地考虑循环.

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



5> Jon B..:

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

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

volatile bool m_shutdown = false;
void Run()
{
    while (!m_shutdown)
    { ... }
}



6> Ken Ray..:

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

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



7> S.Lott..:

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

当我们制造热泵控制器时,有一种电源自检(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

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



8> Andrew Coles..:
#define ever 1
for (;ever;)

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


如果我们要去那个丑陋,为什么不"#define FOREVER while(1)"或类似的东西:)
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有