我正在寻找更多信息/灵感,并且想知道是否存在以下模式。
有时我会遇到一些不应该是无限循环的东西,但如果引入错误则可以是无限循环。
由于它是在 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/