2009-08-21 4 views
1

누구든지 다음 코드가 검사하는 내용을 설명해주십시오. 나는 그것을 이해할 수는 없지만, 단지 그것을 무지에서 내 재 작성에서 제외하고 싶지는 않습니다. 전체 코드는 현재 detailLastDate 사이의 차이를 계산합니다 (예 : Days(detailLastDate) - Days(Now)).이상한 날짜 계산 및 테스트

int num3 = 0; 
num3 = int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(4, 1) 
    + int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(5, 1); 
if (num3 == 0) 
{ 
    detailLastDate = "991231"; 
} 

ADDED :가 두 번 문자 3-0을 구문 분석 왜 내게는 퍼즐 무엇이 경우를 들어, detailLastDate은 값 '090722'을 가지고있다. 그 날짜가 모두 0이 있는지 확인 같은

+0

이중 파싱은 실제로 이상하지만, 내가 말할 수있는 목적은 없습니다. 'num3'은 단지 0과 비교되기 때문에 아무런 차이가 없습니다. 'num3'이 나중에 다른 곳에서 사용되지 않는다면, 그러나 나는 무엇을 위해 상상할 수 없습니다. – Thorarin

답변

1

같습니다,하고 있는지, 991231에 기본적으로 (12 월 31, 1999?)

5

글쎄, 당신이 그것을 이해 할 수 없습니다 당연를 왜냐하면 의미가 없기 때문입니다.

주로, 전달 된 날짜가 "000000"인지 확인하는 것이 목적입니다. 또한 모든 자릿수가 실제로 숫자인지 확인합니다. 그렇지 않은 경우 예외가 있습니다. 문자열의 길이가 6보다 작은 경우에도 예외가 발생합니다.

날짜가 "000000"이면 기본값은 "991231"입니다.

int num3; 
if (detailLastDate.Length != 6 || !Int32.TryParse(detailLastDate, out num3)) 
    throw new FormatException("Invalid date"); 

if (num3 == 0) 
    detailLastDate = "991231"; 

또한 (당신의 코드와는 달리) 너무 긴 문자열에 오류,하지만 난 것을 고려할 것 :

대부분 상응 num3 가정하면 다른 이상한 비교를 사용하지 않을해야 좋은것. 개인적으로 정수 파싱을 모두 없애 버릴 수 있지만 작동하는 것 같아요 :)

올바른 방법으로 리팩터링하려면 CMS 응답을 확인하십시오. 주변 코드가 내가 설명한 부작용에 의존하지 않도록하십시오.

+0

만약 당신이 비교할 필요가있는 것이 모두 0이라면, 정교한 코드를 필요로하지 않습니다 : if (detailLastDate == "000000") –

+0

실제로 내가 쓴 것을 읽었습니까? 나는 이것을 리펙토링에서 함정을 지적하려고 노력하고있어. 비교적 안전한 대체품을 제공했습니다. 깨끗한 코드와 부작용이 관련이 없다면 yes입니다.OP가 모든 코드를 가지고 있기 때문에 OP의 가장 좋은 판사가 될 것입니다. 그런 다음 다시 ** 좋은 ** 코드 인 경우 왜 처음에는 문자열에 날짜가 있습니까? – Thorarin

+0

필자는 모든 구문 분석을 읽고 적절한 날짜 필드를 사용할 것입니다. 그러나 '체크섬'에 0에서 3까지의 숫자가 두 번 포함되는 이유가 있는지 궁금합니다. – ProfK

2

yyMMdd 형식으로 날짜를 구문 분석하고 DateTime.TryParseExact 메서드를 사용하여 변환이 성공했는지 확인할 수 있습니다.

예 :

//... 
string detailLastDate = "090722"; 
DateTime lastDate; 

if (!DateTime.TryParseExact(detailLastDate, "yyMMdd", 
       CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDate)) 
{ 
    // input doesn't match the format 
    lastDate = new DateTime(1999, 12, 31); // default value 991231 
} 
//... 
return (lastDate - DateTime.Today).Days; 
+0

가치가 그래, 그 것 가장 현명한 해결책. 원래 코드에는이 코드가하지 않는 많은 부작용이 있습니다. 주변 코드가 이러한 부작용에 의존하지 않는지 확인해야합니다. 그래서 "거의 동등한"코드를 게시했습니다. – Thorarin

+1

몇 달 동안 MM이 필요합니다. 현재는 1 년, * 분 * 및 하루를 파싱합니다. –

+0

감사합니다. @ 존이 눈치 채지 못했습니다. – CMS

1

글쎄, 일치하지 않는 괄호로 컴파일되지 않습니다 모든 코드의 첫 번째. 원래 코드는 어떻게 생겼습니까?

괄호를 추가하면 코드는 여전히 의미가 없습니다. 그것은 한 번에 문자를 파싱하고 대부분의 문자를 두 번 이상 파싱합니다. 대신 전체 문자열을 파싱 할 수 있습니다. 당신이 문자열이 항상 6 자입니다 항상 숫자가 포함되어 있는지 알고 있다면

, 당신은 코드가 캐릭터 라인을 해석해 준다 추가 확인을 필요로하지 않으며, 당신은 그것을 대체 할 수

if (detailLastDate == "000000") detailLastDate = "991231";