design-patterns - 您紧急打破可能的无限循环的模式是否有一个名称?

标签 design-patterns while-loop

我正在寻找更多信息/灵感,并且想知道是否存在以下模式。

有时我会遇到一些不应该是无限循环的东西,但如果引入错误则可以是无限循环。

由于它是在 Web 应用程序中,如果我们或多或少知道它挂起,我宁愿让它抛出异常,而不是线程被卡住并慢慢耗尽所有资源。

下面有一些类似的代码,这里不讲细节。

此模式是否有名称或任何其他单词可以查找更多对此的想法?

while ( _Combinations.Any() )
{
    var combination = _Combinations.First();

    combination.New.DuplicateIndex = combination.Current.DuplicateIndex;

    RemoveAllFromCombinations(combination.New);

    if ( emergency_break++ > 10_000 )
        throw new ArgumentException("More loops then expected - crash instead of hang");
}

最佳答案

我会应用模板方法模式。

这是一个简单的 Java 示例:

public class LoopTemplate {

    private int maxIterations;

    public LoopTemplate(int maxIterations) {
        this.maxIterations = maxIterations;
    }

    public void execute(LoopCondition loopCondition, IterationCallback iterationCallback) {
        int iterationCount = 0;

        while (loopCondition.isFulFilled()) {
            iterationCallback.run(iterationCount++);

            if (iterationCount >= maxIterations) {
                throw new RuntimeException("Max iteration count exhausted");
            }
        }
    }
}

public interface LoopCondition {

    public boolean isFulFilled();
}

public interface IterationCallback {

    public void run(int iterationCount);
}

然后我就可以这样使用它

LoopTemplate loopTemplate = new LoopTemplate(2);

loopTemplate.execute(() -> true, (int iterationCount) -> {
    System.out.println("iteration: " + iterationCount);
});

输出将是:

iteration: 0
iteration: 1

java.lang.RuntimeException: Max iteration count exhausted

根据您的需要,您可能希望实现 DSL,以使其更具可读性:

loopTemplate
   .until(() -> true)
   .run((int iterationCount) -> {
        System.out.println("iteration: " + iterationCount);
        }
    )

您可能还想向迭代回调添加方法,以便中断并继续循环。

public interface IterationCallback {
    public void run(Loop loop);
}

public interface Loop {
    public int iterationCount();
    public void breakLoop();
    public void nextIteration();
}

但是实现起来会变得更加棘手。 您必须决定是否值得。

关于design-patterns - 您紧急打破可能的无限循环的模式是否有一个名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75369017/

相关文章:

c++ - 使用引用实现状态模式

c++ - 等同于子类的惯用 Go

java - 谓词方法在是/否/否则回答不回答的情况下返回重复提示

python - 我可以通过在 Python 中使用这个新手代码运行 time.sleep() 来损坏系统吗?

c# - 为什么 "while"在 C# 中如此流行?

java - 对于泛型/与泛型有哪些有用的 API?

design-patterns - 使用类/方法的不同实现的设计模式

java - 线程安全静态 map 的延迟加载

loops - 如何在 GDB 脚本中循环直到程序完成?

bash - 在 Firefox 的 newtabs 中打开文件中的 url