다른 사람 asked a similar question하지만 대답은 나에게 명확하지 않습니다.코드 유효성 검사를 코드 계약으로 대체 할 수 있습니까?
우리 프로젝트에는 많은 매개 변수 유효성 검사 코드가 있습니다. 공용 메서드에서만 주로 null 매개 변수 검사입니다.
if (param == null)
{
throw new ArgumentNullException("param");
}
이러한 검사는 사양의 일부가 아닙니다. 그들의 주요 유틸리티는 프로그래밍 오류의 경우 saner 스택 덤프를 얻는 것입니다. 그렇게 간단한 점검이 수행되지 않으면 더미의 한쪽 끝에서 무작위로 10 레벨까지 올라갈 수 있습니다. 다른 라이브러리의 중간 부분에는 NullReferenceException
이 있습니다. 이렇게하면 근본 원인에 대한 전체 백 트레이닝 프로세스가 더 길어집니다. 유효성 검사는 의미 론적으로 명확하며 이전에 문제를 파악할 수 있습니다.
우리는 그 일을 많이하고 있기 때문에, 우리는 그러한 점검을하는 더 짧은 방법을 찾고있었습니다. 예 :
ArgumentHelper.ThrowIfNull(param, "param");
또는 이와 유사한 구문. 기본적으로 오버 헤드를 피하고 싶습니다. if-throw
구문을 사용하면 코드가 불필요하게 길어집니다.
그런 구문을 실험하면서 어설 션 및 코드 계약과 같은 유사한 구문으로 수렴한다는 것을 알았습니다. 코드 분석은 정적 분석의 가능성과 개발주기 초반에 버그를 잡기 때문에 매우 매력적입니다.
그러나 코드 계약이 "입력 유효성 검사"문제 또는 유효성 검사 문제의 모든 종류를 해결하도록 설계되지 않았 음을 이해합니다. Because the exceptions raised by it are not meant to be caught. 기본 동작은 릴리스 빌드에서 이러한 검사의 코드를 제거하기 때문에 디버깅을 쉽게하기위한 것이 아닙니다. The rewriter just seems like a hack around it and it's not very performant either.
"정적 검증"과 "매개 변수 유효성 검사"에서 모두 이해할 수있는 것은 서로 다른 목표를 가지고 있으므로 상호 교환 할 수 없습니다. 그러나 내 프롤로그에 Code.Contracts
을 사용하여 if-then-throw
초반에 자연스럽게 들렸습니다. 뭔가 잘못 됐는지 궁금합니다.
제 질문은 : 매개 변수 유효성 검사를위한 코드 계약을 사용하고 있습니까? 어떤 인증 코드에 대해서도 질문 할 수있는 분명한 질문이 있습니까? "예. 코드 계약을 사용하여 이것을 확인할 수 있습니다"와 "아니오. 코드 계약을 사용하여 확인할 수 없습니다"와 같은 대답을 제시하십시오. 어떻게 구별합니까?
"계약서를 삭제해도 기능이 올바르게 작동합니까?"라는 생각이 들었습니다. 이것이 올바른 접근 방법입니까?
이 또한 매우 깨끗한 방법으로 코드 계약을 예외를 던져 제공 내 확장 방법을 확인하십시오 http://blog.rsuter.com/elegant-method-parameter-validation- with-code-contracts-support/ –
@RicoSuter 귀하의 apprach는 여전히 코드 계약에 대한 런타임 검사를 활성화해야합니다. 왜 그게 나쁜지에 대한 내 대답을 참조하십시오 : http://stackoverflow.com/a/25700857/54937 –
아니요, 런타임 유효성 검사가 비활성화 된 경우에도 예외가 던져 지더라도 예외가 던져 질 수 있습니다. –