2013-05-16 4 views
1

나는 유효성 검사가 실패한 경우 Func가 true를 반환해야하는 양식 인 List<Tuple<Func<bool>, string>>의 형태로 일련의 요구 사항을 유지 관리하는 유효성 검사 시스템을 구축 한 흥미로운 시나리오가 있습니다. 문자열은 테스트가 실패 할 경우 조건을 설명하는 해당 거부 설명입니다. 다음과 같은 검증 시스템과 같은 더 간단한 테스트에서람다 내부의 문자열 범위

은 매우 간단합니다 :

validationChecks.Add(Tuple.Create<Func<bool>, string>(() => 
    value1 == requiredValue, "value 1 did not have the required value")); 

나는 고급 시나리오에서 Func을위한 람다 내에서 변수의 범위를 이해하는 데 어려움을 겪고있어하는 거부에 문자열은 시스템의 다른 부분에 대한 호출에서 계산됩니다.

string rejectionString = null; 
validationChecks.Add(Tuple.Create<Func<bool>, string>(() => { 
    rejectionString = CallToAnotherMethodThatReturnsString(parameter); 
    if (rejectionString != null) { 
     return true; 
    } else { 
     return false; 
    } 
}, rejectionString)); 

편집 : 시나리오는 다음과 같이 보이는 튜플은 여전히 ​​널에서이 검사는 rejectionString을 실패 할 때 테스트를 통해 관찰. CallToAnotherMethod에 의해 생성 된 rejectionString을 대신 사용하고 싶습니다. ref 나 다른 방법으로이 작업을 수행 할 수있는 방법이 있습니까? Tuple의 Item2 안에있는 문자열의 값에 영향을 주려면 Func의 코드가 필요합니다.

CallToAnotherMethodThatReturnsString의 코드는 한 번만 실행하면되는 코드 일 수 있습니다. 그러나 검사가 실패하면 튜플에서 거부 설명으로 반환 된 문자열을 사용하려고합니다. 이 두 번째 예에서 rejectionString을 사용했을 때의 효과는 무엇인지 지금까지 말할 수 없습니다. Tuple 내의 rejectionString은 항상 null이됩니까? 또는 CallToAnotherMethodThatReturnsString이 다른 값을 반환하면 업데이트됩니까?

+2

입니다 (또는 것 그것의 변형) 다양한 테스트? 무엇을 발견 했습니까? –

+0

좋은 점은 두 번째 예제에서 CallToAnotherMethodThatReturnsString 대신 문자열 값을 하드 코딩 했으므로 실패한 테스트의 거부 문자열이 null입니다. 나는 전혀 기대하지 않았던 것입니다 ... –

+0

외부 변수를 닫는 일은 까다 롭습니다. 일반적으로 루프에서 일을 할 때 사람들이 성공할 수있는 것이 아닙니다. 에). 함수 결과에 따라 메시지가 달라 지길 원한다면 여기서 전략을 재고하는 것이 좋습니다. 그러나 누가 알겠는가, 아마도 다른 누군가는 대체 아이디어를 가지고 올 것이다. –

답변

1

아이디어가 효과적 일 수 있습니다. 두 번째 Tuple 매개 변수를 문자열 값 대신 문자열을 반환하는 Func로 변경하면 필요한 항목에 근접 할 수 있다고 생각합니다.

string rejectionString = null; 
validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() => 
{ 
    rejectionString = CallToAnotherMethodThatReturnsString(parameter); 
    if (rejectionString != null) { 
     return true; 
    } else {return false;} 
}, 
()=>rejectionString)); 

은 첫 번째 경우 귀하의 유효성 검사는

validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() => value1 == requiredValue,()=>"value 1 did not have the required value")); 

로 설정하고 검증 논리가 다음 예제 코드를 실행했을 때 당신의 관찰을했다 무엇

if(validationChecks[0].Item1()==false) 
var error = validationChecks[0].Item2(); 
+0

음, 이것은 흥미로운 제안이며, 오늘 오후에 놀아서 내가 필요한 것을 할 수 있는지 알아볼 것입니다. 생각 해줘서 고마워! 나는 그것이 효과가 있다면 답변으로 표시 할 것입니다. +1 지금은 –

+0

와우 감사합니다! 몇 가지 테스트를 마치면 이것이 완벽하게 작동하는 것 같습니다. lambdas 및 캡처 된 변수의 작동 방식에 대해 자세히 알아보십시오. 당신은 락 –

+1

@ JesseCarter 위대한 .. 나는 당신의 문제가 문자열의 작동 방식에 더 많은 것이라고 생각합니다 ...String은 참조 유형이지만 값 유형과 유사하게 동작하므로 변경할 수 없습니다. 귀하의 경우, 당신이 튜플을 만들 때, 튜플은 튜플이 생성되었을 때 null이었던 rejectionString의 복사본을 가지고 있습니다. 나중에 rejectionString을 변경하면 튜플에 저장된 문자열이 변경되지 않고 rejectionString 변수가 변경 되더라도 Item2에서 항상 null이 반환됩니다. – jure