前提
不管语言或所需功能如何,以下代码都应视为错误的形式:
while( true ) {
}
支持论点
该while( true )
循环形式不佳,因为它:
- 打破while循环的隐含契约。
- 暗示它永远循环。
- 必须阅读循环中的代码以了解终止子句。
- 永远重复的循环会阻止用户终止程序中的程序。
- 效率低下。
- 很容易出现错误。
- 无法轻松确定将始终在每次迭代中执行的代码放在何处。
- 导致不必要的复杂代码。
- 自动源代码分析。
- 为了查找错误,程序复杂性分析,安全检查或自动导出任何其他源代码行为而无需执行代码,指定初始中断条件可使算法确定有用的不变式,从而改善自动源代码分析指标。
- 无限循环。
- 如果每个人都总是使用
while(true)
非无限循环,那么当循环实际上没有终止条件时,我们将失去简洁通信的能力。(可以说,这已经发生了,所以要点是没有意义的。)
替代“转到”
以下代码是更好的形式:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
优点
没有标志。没有goto
。没有例外。容易改变。易于阅读。易于修复。另外的代码:
- 从循环本身中分离出有关循环工作量的知识。
- 允许维护代码的人员轻松扩展功能。
- 允许在一个位置分配多个终止条件。
- 将终止子句与要执行的代码分开。
- 对于核电厂更安全。;-)
第二点很重要。在不知道代码是如何工作的情况下,如果有人要求我让主循环让其他线程(或进程)有一些CPU时间,就会想到两种解决方案:
选项1
立即插入暂停:
while( isValidState() ) {
execute();
sleep();
}
选项#2
覆盖执行:
void execute() {
super->execute();
sleep();
}
该代码比带有嵌入式循环的代码更简单(因此更易于阅读)switch
。该isValidState
方法应仅确定循环是否应继续。该方法的主力应该抽象到该execute
方法中,该方法允许子类覆盖默认行为(使用嵌入式switch
和goto
)。
Python范例
将以下答案(针对Python问题)与StackOverflow上发布的内容进行对比:
- 永远循环。
- 要求用户输入他们的选择。
- 如果用户的输入是“重新启动”,则永远继续循环。
- 否则,请永远停止循环。
- 结束。
码
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
与:
- 初始化用户的选择。
- 当用户选择“重新启动”一词时循环播放。
- 要求用户输入他们的选择。
- 结束。
码
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
在这里,while True
导致误导和过于复杂的代码。