2012-01-19 4 views
0

저는 초보자 인 C# 프로그래머입니다. 컴파일러의 관점에서 볼 때 변형이 더 나은 점이 궁금합니다. 내가 다른 프로그래머와 함께 작동하지 않도록코드의 흐름에 관한 기본적인 생각. 새 변수를 만들거나 만들지 않으려면

변형 한

string file = "20071201.22002300.wmv"; //name of the file is YYYYMMDD.HHMMHHMM.wmv 
string[] tmp= file.Split('.'); 
DateTime startDate= new DateTime(Convert.ToInt32(tmp[0].Substring(0, 4)), 
           Convert.ToInt32(tmp[0].Substring(4, 2)), 
           Convert.ToInt32(tmp[0].Substring(6, 2)), 
           Convert.ToInt32(tmp[1].Substring(0, 2)), 
           Convert.ToInt32(tmp[1].Substring(2, 2)), 0); 

DateTime endDate =new DateTime(Convert.ToInt32(tmp[0].Substring(0, 4)), 
           Convert.ToInt32(tmp[0].Substring(4, 2)), 
           Convert.ToInt32(tmp[0].Substring(6, 2)), 
           Convert.ToInt32(tmp[1].Substring(4, 2)), 
           Convert.ToInt32(tmp[1].Substring(6, 2)), 0); 

변형이

string file = "20071201.22002300.wmv"; //name of the file is YYYYMMDD.HHMMHHMM.wmv 
string[] tmp= file.Split('.'); 
int year = Convert.ToInt32(tmp[0].Substring(0, 4)); 
int month= Convert.ToInt32(tmp[0].Substring(4, 2)); 
int day = Convert.ToInt32(tmp[0].Substring(6, 2)); 
int hour = Convert.ToInt32(tmp[1].Substring(0, 2)); 
int minute = Convert.ToInt32(tmp[1].Substring(2, 2)); 
int endHour= Convert.ToInt32(tmp[1].Substring(4, 2)); 
int endMinute = Convert.ToInt32(tmp[1].Substring(6, 2)); 
DateTime startDate= new DateTime(year, month, day, hour, minute, 0); 
DateTime startDate= new DateTime(year, month, day, endHour, endMinute, 0); 

일반적으로 내가 프로그래머로 일하고 있지 않다 때문에 첫 번째 변종 같이 작업하는 것을 선호 , 난 그냥 내 직업에 도움이 도구를 만드는거야, 그리고 나는 또한 컴파일러에 대한 쉬운 첫 번째 변종을 고려하십시오. 내가 틀렸다 감사 사전

+1

파일 이름을 따옴표로 묶지 않아야합니까? – comecme

+0

['DateTime.TryParseExact']의 문제점 (http://msdn.microsoft.com/en-us/library/system.datetime.tryparseexact.aspx)? 그리고 사과, "가장 좋은"방법 같은 것이 없습니다. 이것은 매우 건설적인 것이 아닙니다. 질문을보다 건설적인 방식으로 재구성 할 수 있다면 (문제가 무엇인지, 무엇을 성취하려고하는지 등) 플래그를 지정하면 다시 살펴볼 것입니다 (또는 커뮤니티가 투표를 열어 투표 할 것입니다) . – casperOne

+0

감사합니다. 나는 성능 관점에서 관심을 보였습니다. –

답변

3

무엇을하고 있는지 분명하기 때문에 두 번째를 선호 또한

여러 등 Convert.ToInt32(tmp[0].Substring(0, 4))를 호출하지 않습니다 .

: 첫 번째 예에서하고있는 시간

업데이트

는 더 나은,이 같은 것을 사용

string file = "20071201.22002300.wmv"; 
string[] tmp = file.Split('.'); 

var baseDate = DateTime.ParseExact(tmp[0], "yyyyMMdd", CultureInfo.InvariantCulture); 
var startTime = TimeSpan.ParseExact(tmp[1].Substring(0, 4), "hhmm", CultureInfo.InvariantCulture); 
var endTime = TimeSpan.ParseExact(tmp[1].Substring(4, 4), "hhmm", CultureInfo.InvariantCulture); 

var startDate = baseDate + startTime; 
var endDate = baseDate + endTime; 
1

의 경우

은 수정하십시오 컴파일러 것이다 각 버전의 출력 똑같은 일이.
FWIW, 두 번째 방법을 사용하면 디버깅이 더 쉬울 것이라고 제안합니다. 각 임시 변수는 구문 적으로 머리 속에 유효하게 유지하는 데 도움이되는 이름을 갖습니다.

+0

Convert.ToInt32 (tmp [0] .Substring (0, 4)'가 여러 번 호출되는 것과 같은 결과를 출력한다고 생각하지 않습니다. 첫 번째 예제에서는 두 번째 경우에만 한 번만 호출합니다. – Joey

+0

@Joey : 세분 ​​된 동일한 표현이 있다는 것을 인식하지 못하고 놀랍도록 가난한 컴파일러 여야합니다. 모두 하나의 결과를 사용하지 마십시오. | – DefenestrationDay

+1

IL, 첫 번째 예제에서 두 번째 예제에서보다 System.String.Substring 및 System.Convert.ToInt32를 더 많이 호출합니다. – Joey

2

저는 사람들이 일을 잊어 버리는 경향이 있기 때문에 두 번째 변종을 더 좋아합니다. 몇 달 후 코드의 평화를 보면 다시 이해해야합니다.

시각적으로 이해하기 쉬운 것이 있다면 항상 더 나은 선택입니다.

바보는 컴퓨터가 이해할 수있는 코드를 작성할 수 있습니다. 좋은 프로그래머가 이해할 수있는 인간이 코드를 작성합니다. "- 마틴 파울러을에."리팩토링 "

1
나는 두 가지 이유로 두 번째 버전에 갈 것

:

  1. 당신이 그것을 사용하지 않는 후 다시 코드 작업을 시작해야하는 경우이 소중한 내 의견으로는, 그 안에 무슨 분명하다 잠시 동안.
  2. 두 번째 버전에서는 디버거에서 모든 변수를 검사 할 수 있습니다.이 예제에서는 중요하지 않지만 다른 경우에는 유용 ​​할 수 있습니다.
+0

일회용 유틸리티를 작성한 후에 코드를 버리지 않는 한, 다른 프로그래머와 항상 작업하고 있습니다. 다음 번에 코드를 변경해야 할 때. 디버깅 (또는 로깅 ...) 할 때 중간체를 검사 할 수있는 좋은 점. –

0

코드는 깨끗해야합니다. &. 컴파일러에는 차이점이 없으며 퍼포먼스 관점에서 볼 때 오버 헤드는 거의 없거나 전혀 아닐 수도 있습니다. 따라서 두 번째 변형이 더 좋습니다.

0

여기에 더 우아한 해결책

 string dateString = "20071201.22002300.wmv"; 
     string sStartDate = dateString.Remove(dateString.Length - 5, 4); 
     string sEndDate = dateString.Remove(dateString.IndexOf('.')+1, 4); 
     string format = "yyyyMMdd.HHmm"; 
     CultureInfo provider = CultureInfo.InvariantCulture; 

     dateString = dateString.replace(".wmv", String.Empty); 
     DateTime dtStart = DateTime.ParseExact(sStartDate, format, provider); 
     DateTime dtEnd = DateTime.ParseExact(sEndDate, format, provider); 
0

나는 일반적으로 상황에 따라 두 가지 방법을 사용을합니다.

변수가 한 번만 사용되는 경우 첫 번째 방법을 사용합니다. 두 번째는 변수를 여러 번 사용하려고 할 때 사용합니다.

이것은 성능에 많은 영향을 미치지 않을 것입니다. 그러나 변수를 선언 한 다음 무언가를 무시한 다음 무언가를 무시하고 동일한 변환을 수행하는 것은 무의미합니다./할 수있을 때 여러 번 값에 캐스트합니다. 한 번 변수에 저장됩니다.

첫 번째 예에서는 코드가 실제로하는 일을 주석으로써 더 읽기 쉽도록 만들 수 있다고합니다.

관련 문제