我正在尝试重构以下代码,因为我不认为它的结构很好。 你能想到更优雅的方式吗?
Bar::Bar()
{
m_iter1 = 0;
m_iter2 = 0;
}
bool Bar::foo()
{
_reinitialize();
for (; m_iter1 < 2; m_iter1++, m_iter2 = 0) {
_log("TRYING METHOD: [%d]", m_iter1);
if (_something_wrong(m_iter1)) {
return false;
}
for (; m_iter2 < 6; m_iter2++) {
if (_try_with_these_params(m_iter1, m_iter2, ...)) {
m_status = success;
// store next iteration in case we need to retry.
m_iter2++;
return true;
}
}
}
return false;
}
bool try_foo(Bar& bar)
{
if (bar.foo()) {
if (meet_some_criteria) {
return true;
} else {
bar.invalidate();
// retry. the Bar object stores the state.
try_foo(bar);
}
} else {
return false;
}
}
int main()
{
Bar bar;
if (try_foo(bar)) {
_log("SUCCESS");
} else {
_log("FAILURE");
}
}
代码循环遍历不同的参数集,并尝试使用这些参数执行某些操作。如果操作成功,则外部代码可能使操作无效并尝试重试。执行操作的对象存储状态,以便外部代码可以在其停止的位置重试并重新进入参数循环。
使用一个参数的输出会影响其他参数,因此需要在Bar
类中本地完成计算。
我想将这个想法扩展到更多维度,但使用当前设计这样做是笨拙的。
答案 0 :(得分:1)
这里有很多取决于各种行动的成本。
如果最初生成候选参数集很便宜(并且该集合不是太大),那么您可能只想生成所有候选集,然后将该结果提供给外部代码然后依次尝试每个,直到找到外部代码可以接受的那个。