2013-05-24 2 views
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 클래스 내에서 로컬로 계산해야합니다.

이 아이디어를 더 많은 차원으로 확장하고 싶습니다.하지만 현재 디자인으로 그렇게하는 것은 어색합니다.

답변

1

여기서 많은 부분은 다양한 조치가 얼마나 비싼 지에 따라 다릅니다.

후보 매개 변수 집합을 처음 생성하는 것이 값이 싸고 (집합이 이 아니면) 모든 후보 집합을 생성 한 다음 그 결과를 외부 코드에 제공하고 각각을 시도 할 수 있습니다 외부 코드가 받아 들일 수있는 것을 찾을 때까지 돌리십시오.

+0

값 비싼 편에서 동작이 적지 만 매개 변수 집합이 커질 수 있습니다. – izak

+0

또한, 외부 코드가 현재 반복이 성공적인 결과를 제공한다고 결정한 후에 적절한 매개 변수로 적절한 조치를 취할 수 있어야합니다. – izak

관련 문제