次のコードはうまく構造化されていないと思うので、リファクタリングしようとしています。これを行うためのよりエレガントな方法を考えることができますか?
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
1 つのパラメーターを使用した出力は他のパラメーターに影響を与えるため、計算はクラス内でローカルに実行する必要があります。
このアイデアをより多くの次元に拡張したいと考えていますが、現在のデザインでそれを行うのは不器用です。