2009-07-08 5 views
0

때때로 시퀀스 다이어그램을 구현할 때와 같이 설정된 순서로 수행해야하는 작업 목록 만 있습니다. 시퀀스 변경을 통해 미묘한 버그를 유발하는 리펙토링을 방지하기 위해 코드 실행 순서를 적용하는 가장 좋은 방법은 무엇입니까?코드 실행 순서 적용

기존 단위 테스트에서 foo() 및 bar()의 실행 순서를 변경하면 발생하는 문제를 파악할 수 없다고 가정 해 봅니다.

내가 본과 사용했던 방법 중 몇 :

  1. 댓글 (그들을 이해 &을 읽는 사람에 의존) :

    // do this
    foo();
    // then this
    bar();

  2. 유창함 문법을 (코드를 영어와 같이 읽고 더 나은 리펙토링을 방해하도록) :

    obj
    .Do
    .foo()
    .Then
    .bar();

  3. 상태 변수 balking & (너무 정교) : 기능에 논리 블록을 그룹화

    foo_done=false;
    if(foo()) foo_done=true;
    if(foo_done) bar(); else throw_an_exception;

  4. :

    void foo_bar()
    {
    foo();
    bar();
    }

... 많은 설명이 더 너무 추한 (중첩이 이벤트는, 함수 포인터의 배열, 이름 기능 (시작), 중동() 및 종료() ...) .

이런 종류의 작업을 수행하는 데있어 우수한 패턴이 있습니까?

+1

더 구체적인 예가 더 나은 답변을 이끌어 낼 수 있다고 생각합니다. 일을 완수해야하는 순서는 얼마나 엄격합니까? 정확한 순서로 몇 가지 메소드를 항상 호출해야하는 경우, 올바른 순서로 모든 메소드를 호출하는 void doEverything()에 무엇이 잘못된지에 대한 오류가 발생하지 않습니다. 임시 주문에서 작업을 호출해야 할 경우 어떤 제약이 있습니까? 왜 특정 순서로 호출해야합니까? 그들은 어떤 일반적인 상태에서 작동합니까?부작용이 있습니까? –

답변

1

단위 테스트에서 코드를 포착하지 못하고 코드에서 의존성이 명시 적으로 나타나지 않는 경우 왜 순서가 중요 할 지 혼란 스럽습니다. 부작용이 foo() 및 bar()의 작동에 중요한 부분임을 의미합니다. 어떤 경우에 가장 좋은 설계 전략은 이러한 부작용을 명확하게 만드는 것입니다!

+0

종속성을 어떻게 명시합니까? 코드 몸체 외부에서 테스트를 통과하도록 명령하는 유일한 방법은 없습니까? 아니면 시퀀스를 명시 적으로 만드는 방법이 있습니까? – lotsoffreetime

+0

Eh? 가능한 가장 직관적 인 의미입니다 : File handle = function_a (filename); 레코드 수 = function_b (파일 핸들); 데이터 구조 = function_c (파일 핸들, 레코드 수); 아무도 그 순서를 바꾸지 않을 것입니다 ... –

+0

모든 시퀀스가 ​​분명하지는 않습니다. get_price(); apply_discount (10 %); add_tax(); 세금이 추가 된 후 할인이 적용되면 문제가 발생할 수 있으며 단원 테스트 (비즈니스 논리에 대한 이해)만이 귀하를 구할 것입니다. 어쩌면 "시퀀싱 비즈니스 논리"가 내가 뒤따라 오는 구절일지도 모른다. – lotsoffreetime

0

프로 시저를 호출 한 후 일어난 일 (상태, 속성 변경)을 확인하기 위해 단위 테스트를 작성하므로 일부 메소드가 호출되었는지 여부를 확인할 필요가 없다고 생각합니다.

또한 테스트를 어떤 방법에 묶는 경우 나중에 foo()와 동일한 효과를 가진 다른 방법을 사용하도록 시스템을 변경하면 시스템이 올바른 일을하고있는 경우에도 테스트가 실패합니다.