【发布时间】:2021-06-21 18:05:58
【问题描述】:
我有一个算法大纲 - 一些必须按特定顺序执行的逻辑步骤。算法的结果必须是某个数字。这自然让我想到了使用模板方法模式。这适用于void 方法,但我的问题来了:算法中的每个步骤都不是void 方法,但允许返回一个数字(所以它们是int 方法) - 如果一个步骤返回一个非零数,这个数是算法执行的结果,如果是零 - 继续执行下一步。
这听起来可能真的微不足道,但我仍然觉得有这样的东西有点难看:
public int algorithm() {
int resultStep1 = step1();
if (resultStep1!=0) {
return resultStep1;
}
int resultStep2 = step2();
if (resultStep2!=0) {
return resultStep2;
}
...
}
当然step1()、step2()等都是抽象方法,在我扩展的相应类中都有自己的具体实现。
我想到的另一个想法是使用异常,但是当我们在这里讨论控制流时,这将是一种反模式。
我在这里遗漏了什么,还是我必须这样写?
【问题讨论】:
-
我在问题的一半停止了理解。你想返回第一个非零步,真正的问题是什么
-
Iterable 怎么样?您可以将 next() 写入您的 steps() ,它不会返回下一步,而是返回结果,如果它不为零。全部紧密成一个整洁的循环。
-
@RoyalBg 当某些步骤返回非零数字时,这就是算法的返回值,否则继续执行 N 步骤并返回其他东西作为最后的手段
-
你可以看看
ComparisonChainfrom Google Guava,它正在做你想做的事情。
标签: java algorithm template-method-pattern