0

我正在尝试重构以下代码,因为我认为它的结构不好。你能想出一个更优雅的方法来做到这一点吗?

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类内本地完成计算。

我想将这个想法扩展到更多维度,但是用当前的设计这样做很笨拙。

4

1 回答 1

1

这里很大程度上取决于各种行动的成本。

如果最初生成候选参数集很便宜(并且集不是太大),那么您可能只想生成所有候选集,然后将该结果提供给外部代码并依次尝试每个,直到找到一个外部代码将接受。

于 2013-05-24T15:22:16.493 回答