猛击阀模式

时间:2015-03-05 10:30:47

标签: algorithm design-patterns language-agnostic

在过去的几十年里,我曾经看到过的一些事情是关于阀门类型的代码,其中存在一个设计值,当某个值被破坏或者某个值被破坏时,该值会递减/递增以强制循环退出迭代已经过去了。

有点抽象吗?

一些具体的例子:

文件已读

在这种情况下,文件正在一夜之间在数据工厂中读取,因此需要在一定时间内处理,以便系统在早上可用。注:文件是否完成无关紧要。

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)的情况下,如果你人为地退出循环,这可能被视为代码味道吗?

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}}?)。