2014-01-06 2 views
5

IMHO, 매개 변수가있는 공용 메서드는 다른 프로그래머가 호출 할 수 있으므로 매개 변수 값을 확인하고 해당 매개 변수가 유효하지 않은 경우 의미가 유용합니다 (ArgumentException). 이 이상 ...공용 메서드에서 코드 계약을 사용하려는 이유는 무엇입니까?

public void Toto(string parameter) 
{ 
    Contract.Requires(parameter != null); 
    //... 
} 

:

말했다되고 그건

, 왜 나는이 선호?

public void Toto(string parameter) 
{ 
    if (parameter == null) 
     throw new ArgumentNullException(nameof(parameter)); 
    //... 
} 

첫 번째 시나리오에서 런타임 계약 검사는 예외가 발생하도록 설정되어야합니다. 우리가 알고있는 것처럼이 옵션은 릴리스 빌드에 대해 선택되지 않아 매개 변수 유효성 검사가 발생하지 않을 것입니다. 발표 된 제품의 일부로 알 수도 있고 그렇지 않을 수도있는 사람이 사용하기로되어있는 공개 방법의 경우 이는 잘못된 생각처럼 보입니다.

또한 런타임 빌드가 릴리스 확인에 사용되는 경우 일반 .NET 개발자가 예상하는 예외 (이 경우 ArgumentNullException)는 예외가됩니다.

그래서 나는 무엇을 놓치고 있습니까? 왜 "전통적인"if-throw 패턴보다 코드 계약을 사용합니까?

+0

[예외를 던집니다. Contract.Requires ?] (http://stackoverflow.com/questions/14991647/throwing-an-exception-vs-contract-requirest) –

답변

5

코드를 사용하는 사람들이 정적 분석기를 사용하여 코드에서 오류를 찾을 수 있기 때문에 계약을 사용하게됩니다. 또한 Contract.Ensures 메소드를 구현하여 다른 프로그래머가 함수가 반환하도록 보장 할 수 있도록 구현할 수 있습니다.

아마도 릴리스 코드 대신 대체 요구 형식을 사용해야합니다.

public void Toto(string parameter) 
{ 
    Contract.Requires<ArgumentNullException>(parameter != null); 
    //... 
} 

이 버전은 매개 변수가 null 인 경우 실제로 예외를 throw합니다.

+2

가능한 복제본은 런타임 검사가 필요합니다. 릴리스 빌드에 사용할 수 있습니까? 이것에 결점은 없는가? – Crono

+0

예. DLL에 대한 런타임 검사가 필요합니다 (단, 릴리스 필요 옵션 만 선택하면됩니다). if ... throw 접근법에 비해 이것에 대한 많은 단점이 없을 것입니다. 그리고 매개 변수를 문서화 할 수 있다는 이점을 얻으려면 –

+0

XML 문서에 직접 입력해야합니다. 좋습니다. :) 또한, Requery <> 메소드는 ArgumentException, InvalidOperationException 또는 NotSupportedException과 같은 프로그래밍 예외를 염두에두고 작성되었습니다. 즉, 소프트웨어 개발자에게 뭔가를 의미합니다. 나 맞아? – Crono

관련 문제