나는 유효성 검사가 실패한 경우 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
이 다른 값을 반환하면 업데이트됩니까?
입니다 (또는 것 그것의 변형) 다양한 테스트? 무엇을 발견 했습니까? –
좋은 점은 두 번째 예제에서 CallToAnotherMethodThatReturnsString 대신 문자열 값을 하드 코딩 했으므로 실패한 테스트의 거부 문자열이 null입니다. 나는 전혀 기대하지 않았던 것입니다 ... –
외부 변수를 닫는 일은 까다 롭습니다. 일반적으로 루프에서 일을 할 때 사람들이 성공할 수있는 것이 아닙니다. 에). 함수 결과에 따라 메시지가 달라 지길 원한다면 여기서 전략을 재고하는 것이 좋습니다. 그러나 누가 알겠는가, 아마도 다른 누군가는 대체 아이디어를 가지고 올 것이다. –