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");
    }
}

コードはさまざまなパラメーター セットをループし、これらのパラメーターを使用して何らかのアクションを実行しようとします。アクションが成功した場合、外部コードはアクションを無効にし、再試行を試みる可能性があります。アクションを実行するオブジェクトは状態を保存するため、外部コードは再試行して中断した場所からパラメーター ループに再び入ることができます。

Bar1 つのパラメーターを使用した出力は他のパラメーターに影響を与えるため、計算はクラス内でローカルに実行する必要があります。

このアイデアをより多くの次元に拡張したいと考えていますが、現在のデザインでそれを行うのは不器用です。

4

1 に答える 1

1

ここでの多くは、さまざまなアクションのコストに依存します。

最初に候補パラメーター セットを生成するのが安価な場合 (およびセットが大きすぎない場合) は、すべての候補セットを生成し、その結果を外部コードに渡して、次のものが見つかるまで順番に試してみることをお勧めします。外部コードが受け入れます。

于 2013-05-24T15:22:16.493 に答える