【发布时间】:2015-05-06 16:35:51
【问题描述】:
在过去的几十年里,我见过很多次的事情是 slam valve 类型代码,其中有一个人为的值,一旦某个值被破坏,它就会递减/递增以强制循环退出,或者在某些情况下迭代已经过去。
对你来说有点抽象?
一些具体的例子:
文件读取
在这种情况下,文件在数据工厂中被读取过夜,因此需要在特定时间处理,以便系统在早上可用。注:文件是否完成并不重要。
int linesRead = 0;
const int SillyAmount = 1000000;
while (!EOF)
{
text = ReadLine();
// Do Some complicated processing with the text
linesRead++;
if (linesRead > SillyAmount)
break;
}
服务对话
在此示例中,对象通过服务调用逐渐增强,直到数据足够好以便以后处理。
int conversationLines = 10;
while (conversationLines > 0 && conversation.Status != Complete)
{
conversation.Next();
// Process conversation
conversationLines--;
}
问题。
(1) 这种事情有设计模式或类似的吗?
(2) 在没有 (1) 的情况下,并且考虑到您人为地退出循环,这是否可以被视为代码异味?
【问题讨论】:
-
好吧,Dijkstra 可能会抱怨第一个,但他抱怨大多数事情 ;) 使用
break;而不是将所有循环退出条件限制在while表达式中会稍微难一些在循环之后的第一行代码中对世界状态做出保证,因为您必须通过循环体将所有break可能性和||收集在一起。但通常情况下,试图将所有循环退出条件塞入while表达式会使事情变得更加复杂。 -
“slam valve”是新的。我一直把它称为限制。
-
我一直发现人们将这些事情称为节流(如果您是老派,则为限速)或分块
-
我不会称之为模式,而是一种技术。
标签: algorithm design-patterns language-agnostic