2017-10-26 15 views
-1

를 호출시에 예외를 던져 I가 IEnumerable<whatever>을 반환하고 yield return myWhatever 구조를 통해 그렇게 내가 상속 한 방법 :포스 수율 복귀 방법은

public IEnumberable<whatever> GetWhatevers() { 
    while (true) {  
     // do calculations 
     yield return myWhatever 
    } 
} 

내가 루프이 원인이되는 버그를 발견 클래스의 컬렉션 중 하나가 null 무한히 경우, 그래서 나는 수표를 추가하고 테스트 썼다 : (나는 결코 실제로 내가 메소드를 호출해도 결과를 반복하는 시작하기 때문에이 테스트가 실패로 인해

public IEnumberable<whatever> GetWhatevers() { 

    if (_dependentList == null || _dependentList.Count == 0) { 
     throw new InvalidOperationException("Unable to process without whatevers"); 
    } 

    while (true) {  
     // do calculations 
     yield return myWhatever 
    } 
} 

void MyWhateverThrowsIOEOnEmptyList() { 
    var sut = new MyThing(null); 
    Assert.ThrowsException<InvalidOperationException>(() => { 
     var results = sut.GetWhatevers(); 
    }); 
} 

지금 실현을에구조).

void MyWhateverThrowsIOEOnEmptyList() { 
    var sut = new MyThing(null); 
    Assert.ThrowsException<InvalidOperationException>(() => { 
     var results = sut.GetWhatevers().ToList(); 
    }); 
} 

을 ...하지만 난 그것을 좋아하지 않아 :

나는이 일을하여 테스트를 해결할 수 있습니다. 즉, 호출자가이 메서드를 호출 할 때마다 내부에 IOE가 숨겨져 있다는 결과가 액세스 될 때까지 알 수 없습니다. 이 결과 변수는 Timbucktu로 되돌아 갈 수 있으며, 시간 폭탄이라는 것을 전혀 모르는 채로 되돌아 갈 수 있습니다.

이제이 방법을 사용할 때마다 그 안에 숨어있을 수있는 예외가 있음을 기억해야합니다.

이 방법은 기존 루프를 사용하여 다시 작성하려는 경우 너무 복잡합니다. 문제가 있다고 부를 때 알 수 있도록 "해결 시간"대신 "호출 시간"에 예외가 발생하도록 강제 할 수있는 방법이 있습니까?

+3

(이 추한 약간의 부작용이 ... yield''의 장점 가치가하지 않는 것) – jleach

+1

당신은'에서'항복 return' 코드를 넣을 수 있습니다 private GetWhateversInternal()'을 호출하고,'GetWhatevers()'를 체크하여'return GetWhateversInternal();'를 호출합니다. –

+0

반복기를 사용하는 것이 유용한 것은 하나뿐입니다. 그들은 그것을 반복 할 것입니다. ToList() 또는 foreach를 사용하든 MoveNext()를 호출하든 관계없이 모든 비트는 동일합니다. –

답변

1

전화 서로 반복자 방법 :

public IEnumerable<Whatever> GetWhatevers(){ 
    if (_dependentList == null || _dependentList.Count == 0) { 
     throw new InvalidOperationException("Unable to process without whatevers"); 
    } 

    return GetWhatevers_Impl(); 
} 

private IEnumerable<Whatever> GetWhatevers_Impl(){ 
    while (true) {  
     // do calculations 
     yield return myWhatever 
    } 
} 
+0

Herp-a-derpa, 이것이 핵심 요소입니다. 당신이 먼저 대답했기 때문에 나는 그것을 당신에게 줄 것이지만 다른 사람들에게도 감사합니다. – jleach