프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 2.2 변화하는 조건

Victory_HA 2022. 3. 31. 22:28

오류 발생 가능한 코드

  • 코드만 보면 오류가 없어보이는 코드입니다.
DateTime birthday = new DateTime(2016,1,1);

if(birthday == DateTime.Today)
{
    var client = new WebClient();

    var message = client.DownloadString("http://...");
    Console.WriteLine(message);
    Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", DateTime.Today);
}
  • 아래 상황에서 날짜 확인 시점과 출력할 때 시점이 달라서 오류가 발생할 수 있습니다.
    • 다른 서버에 접속하는 경우 서버가 느리면 시차가 발생하여 시간 차이가 수십 초가 발생하여 오류 발생할 수 있습니다.
      ```
  1. 현재 날짜가 생일인지 확인한다.(생일 당일 오후 11시 59분 55초)
  2. 생일이라면 다음 처리를 실행한다. (생일 당일 오후 11시 59분 55초)
  3. 메시지를 다운로드한다.(생일 당일 오후 11시 59분 55초)
  4. 10초 기다린다.
  5. 메시지를 출력한다. (생일 다음날 0시 0분 5초)
  6. 날짜와 함께 '생일 축하.'메시지가 출력된다. (생일 다음날 0시 0분 5초)

개선 코드1

  • DateTime.Today를 변수에 초기화하면, 날짜 확인 시점과 출력할 때 시점이 동일해집니다.
  • 완벽한 코드는 없다는 말이 있듯이, 아래 코드에는 이슈가 될 수 있는 부분이 존재합니다.
    • 생일이 지난 후에 생일 축하 메시지가 출력될 수 있습니다.
DateTime birthday = new DateTime(2016,1,1);
DateTime today = DateTime.Today;

if(birthday == today)
{
    var client = new WebClient();

    var message = client.DownloadString("http://...");
    Console.WriteLine(message);
    Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", today);
}

개선 코드2

  • 날짜가 다음 날로 바뀌기 10분 전부터 생일일 가능성이 있다고 예측해서 그 날 자정에 메시지를 출력하도록 수정합니다.
DateTime birthday = new DateTime(2016,1,1);
DateTime today1 = DateTime.Today;

if(today1 > birthday.AddMinutes(-10) && today1 < birthday.AddDays(1))
{
    var client = new WebClient();
    var message = client.DownloadString("http://...");

    DateTime today2 = DateTime.Today;
    if (birthday == today2)
    {
        Console.WriteLine(message);
        Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", today2);
    }
}

정리

  • 네트워크 통신에서 지연은 당연히 발생합니다.
  • 초 단위로 정확한 날짜를 측정하는 것은 의미가 없습니다.
  • 개선코드1의 방법이 간단하면서도 문제가 발생할 가능성이 낮습니다.
  • 하지만 상황에 따라 정확한 날짜를 측정을 위해서라면 개선코드2의 방법을 사용하는게 좋습니다.