在过去的几十年里,我曾经看到过的一些事情是关于阀门类型的代码,其中存在一个设计值,当某个值被破坏或者某个值被破坏时,该值会递减/递增以强制循环退出迭代已经过去了。
有点抽象吗?
一些具体的例子:
文件已读
在这种情况下,文件正在一夜之间在数据工厂中读取,因此需要在一定时间内处理,以便系统在早上可用。注:文件是否完成无关紧要。
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)的情况下,如果你人为地退出循环,这可能被视为代码味道吗?
答案 0 :(得分:0)
你的第一个例子可以写成:
int linesRead = 0;
const int SillyAmount = 1000000;
do {
text = ReadLine();
// text processing
} while (!EOF && ++linesRead <= SillyAmount);
不再是黑客行为(不是break
)。这个没有出现任何模式。
第二个留下更多的解释(需要一个更完整的例子来真正告诉)。我们可以争辩说,对话对象应该设计为state machine(另请参阅state pattern)并在内部处理对话以防止在开放时出现此类代码。要完成的实际处理可以作为(减少?)函数传递,或者使用某种strategy pattern实现,具体取决于预定义的会话类型。有很多方法可以重新安排它。我们需要一个更现实的例子,因为这个有点奇怪(会话有迭代器(conversation.Next();
),但行数在外面...可以告诉它处理一定数量{{ 1}}?)。