2013-01-02 6 views
3

경고를받지 않고 코드 계약에 TryParse를 사용하는 방법 :내가 경고를 코드 계약을 사용하는 경우

방법에

감지 전화 'System.Int32.TryParse (선택 System.String, 선택 System.Int32 @)' 아래의 코드처럼 inteface을 정의 인터페이스 코드와 계약 클래스를 갖는 방법

의 계약에 [순수]없이. 질문은 문자열 인 orgNumberWithoutControlDigit이 유효한 정수로 변환 될 수 있는지 확인하는 것입니다. 계수가 작동하기위한 전제 조건입니까?

public string getControlDigit(string orgNumberWithoutControlDigit) 
    { 
     List<int> orgNumberNumbers = this.getNumberList(orgNumberWithoutControlDigit); 

     List<int> productList = orgNumberNumbers.Zip(this.weightNumberList, (first, second) => first * second).ToList(); 

     int modular = productList.Sum() % 11; 

     string controlDigit = getControlDigit(modular); 

     return controlDigit; 
    } 

private static string getControlDigit(int modular) 
    { 
     string controlDigit; 


     if (modular == 0) 
     { 
      controlDigit = "0"; 
     } 
     else if (modular == 1) 
     { 
      controlDigit = "-"; 
     } 
     else 
     { 
      int result = 11 - modular; 
      controlDigit = result.ToString(); 
     } 


     return controlDigit; 
    } 

[ContractClass(typeof(CalculateOrgNumberControlDigitBusinessContract))] 
public interface ICalculateOrgNumberControlDigitBusiness 
{ 
    string getControlDigit(string orgNumberWithoutControlDigit); 
} 


[ContractClassFor(typeof(ICalculateOrgNumberControlDigitBusiness))] 
public abstract class CalculateOrgNumberControlDigitBusinessContract:ICalculateOrgNumberControlDigitBusiness 
{ 
    public string getControlDigit(string orgNumberWithoutControlDigit) 
    { 
     Contract.Requires(orgNumberWithoutControlDigit.Length == 8); 
     int parseResult; 
     Contract.Requires(int.TryParse(orgNumberWithoutControlDigit, out parseResult)); 
     Contract.Ensures(parseResult >= 0); 
     var result = Contract.Result<string>(); 
     Contract.Ensures(result != null && result.Length == 1); 

     return default(string); 
    } 
} 
+0

"순도"(http://msdn.microsoft.com/en-us/library/dd264808.aspx)를 읽으십시오. –

답변

1

나는 당신이 달성하고자하는 것을 이해하지만, 나는 문자열로 orgNumberWithoutControlDigit을 전달하는 [원문] 진짜 범인이 여기 getControlDigit 것을 말할 것입니다.

계약을 체결해도 호출자는 계약을 충족시키기 위해 문자열을 int로 변환해야합니다. 이제 호출자가 int로 해당 변환을 작성한 경우 대신 int를 전달하지 않으십시오.

저는 Code Contracts에 대한 엄청난 팬입니다. 대부분의 프로젝트에서이 코드를 사용하고 있으며, 그것이 은하가 아니라는 것을 알았습니다. 따라서 문자열 매개 변수가 필요한 경우 계약을 모두 제거하고 사용하기 전에 문자열이 유효한 형식인지 확인하십시오.

어쩌면 OrgNumberValidator 도우미가 계약에 의존하는 것보다 나은 선택 일 수 있습니까?

편집 : 사실, 나는 그것을 처리하기위한 OrgNumber 클래스를 만드는 것이 좋습니다.

1

대신 직접 int.TryParse를 호출 순수 도우미 메서드 만들 수 있습니다 예외의 모든 유형이 발생하는 경우

[Pure] 
private static bool IsInt(string s) 
{ 
    int n; 
    return int.TryParse(s, out n); 
} 

당신은 false를 반환 더 가서 try 블록에서 TryParse 포장 수를 (단지 할 수 안전한쪽에).

그러나 필자는 가능한 경우 정수를 나타 내기 위해 문자열을 전달하는 것을 피함으로써 더 잘할 것이라고 Michael의 의견을 공유하는 경향이 있습니다.

+0

예. 그리고 코드 계약을 통해 발견 한 또 다른 사항은 '계약'을 위해 디자인 할 수 있다는 것입니다.하지만이 순수한 도우미를 계약을 체결하기 만하면 즉시 계약을 체결 할 수 있습니다. 클래스를 디자인하는 경우 계약을 진행하기 위해 해당 클래스에 구현을 추가하지 않아도됩니다. 그것은 나쁜 계약을하는 것의 징후 일뿐입니다. 동의겠습니까? –

+0

@MichaelViktorStarberg 재미있는 점입니다. 필자는 순수한 도우미를 추가해야 할 필요가 복잡한 입력이나 출력이있는 방법을 제안한다는 점에 확실히 동의 할 것입니다. 이는 입력을 단순화하고 도우미가 필요하지 않게하는 기회 일 수 있습니다. –

관련 문제