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

[C#] 코딩의기술(실전편) - 3.5 짧은쿼리 VS 긴 쿼리

Victory_HA 2022. 3. 31. 22:32

1. 긴 쿼리

  • 쿼리의 길이가 길면 코드 가독성이 떨어진다.
    static void Example_LongQuery()
    {
      object[] arr = { 5, 3, 2, 4, 1, "hello" };
    
      var arr2 = arr.OfType<int>().Where(x => x >= 2).OrderBy(x => x).Skip(1).Take(2).Select(x => x.ToString("C")).Reverse().ToArray();
    
      foreach (var item in arr2)
      {
          Console.WriteLine(item);
      }
    }
  • 1.1 단순 긴 쿼리 예제

2. 긴 쿼리를 자른다

  • 긴 쿼리를 여러 개로 자르는게 좋다.
  • 짧은 쿼리로 작성하면 계산의 중간 결과를 확인할 수 있습니다.
  • 예제와 같이 작성하여 중간 결과를 확인할 수 있습니다.

2.1 긴 쿼리 자르기 예제

static void dump<T>(string label,IEnumerable<T> en)
{
    Console.WriteLine(label + ": ");
    foreach (var item in en)
    {
        Console.WriteLine(item);
    }
    Console.WriteLine();
}

static void Example_ShortQuery()
{
    object[] arr = { 5, 3, 2, 4, 1, "hello" };

    IEnumerable<int> q1 = arr.OfType<int>();
    dump("q1", q1);
    var q2 = q1.Where(x => x >= 2);
    dump("q2", q2);
    var q3 = q2.OrderBy(x => x);
    dump("q3", q3);
    var q4 = q3.Skip(1);
    dump("q4", q4);
    var q5 = q4.Take(2);
    dump("q5", q5);
    var q6 = q5.Select(x => x.ToString("C"));
    dump("q6", q6);
    var q7 = q6.Reverse();
    dump("q7", q7);
    var q8 = q7.ToArray();
    dump("q8", q8);
    foreach (var item in q8)
    {
        Console.WriteLine(item);
    }
}

2.2 실행결과

2.3 Printf 디버그

  • 2.1 예제와 같이 코드를 변경하여 중간 결과를 출려가는 디버그 기법은 Printf 디버그입니다.
  • 디버거를 사용할 수 없을 때 사용합니다.
  • C#에서는 Console.Write(), Console.WriteLine()을 사용합니다.
  • C#에서는 System.Diagnostics.Trace, Debug.Write, Debug.WriteLine을 사용합니다.
  • 일반적인 출력과 디버그 정보 출력을 분리하는게 좋습니다.

3. 쿼리 정리

  • 긴 쿼리를 중간마다 줄바꿈을 통해 행 수를 늘려서 가독성을 높일 수 있습니다.
  • 긴 쿼리 예제에서 값 선택과 그렇지 않은 부분을 나누는 방법을 사용할 수 있습니다.
static void Example_ArrangeQuery()
{
    object[] arr = { 5, 3, 2, 4, 1, "hello" };
    var q1 = arr.OfType<int>()
        .Where(x => x >= 2)
        .OrderBy(x => x)
    var q2 = q1.Skip(1)
        .Take(2);
    var arr2 = q2.Select(x => x.ToString("C"))
        .Reverse()
        .ToArray();
    foreach (var item in arr2)
    {
        Console.WriteLine(item);
    }
}