ITEM 38 :: EFFECTIVE C#


안녕하세요, 38번째 시간입니다.


이번 챕터는 메서드보다 람다 표현식이 낫다, 입니다. 다만, 책에서 나오는 람다 표현식은 이를 단독으로만 사용했을 때의 부가효과를 말하는 것이 아닌 것 같네요.

설명

  1. 람다 표현식을 사용했을 때 코드 중복이 일어나는 부분이 있어도, 메서드를 사용한 것보다는 재사용성이 좋아 간단한 코드에 대해서는 메서드를 사용하는 것보다 람다 표현식을 사용하면 더 좋다.

  2. 또한 람다 표현식을 포함하는 간단한 메서드를 작성하여 쿼리의 일부분을 대체할 수 있다.

  3. 2번과 같은 메서드들은 반드시 입력 시퀀스를 취하도록 작성되어야하며, (입력받아야 된다는 것) yield return 키워드를 이용하여 시퀀스를 반환해야 한다.

  4. 이와 같은 패턴을 사용하면 원격지에서 수행할 새로운 표현식 트리를 생성하기 위해 IQueryable을 사용하는 Enumerator를 조합하여 사용할 수 있다. 이와 같이 사용하게되면 여러 단계에 걸쳐 쿼리를 수행하더라도 결과적으로 원격지에서 쿼리가 수행돼야 할 시점에 단일의 표현식 트리로 결합된다.

  5. 또한 앞서 잘게 쪼갠 코드를 재결합하여 응용프로그램 내에서 재사용할 수 있는 형태의 더 큰 쿼리를 만드는 것이다. 이러한 기법을 사용하면 첫 번째 예제에서 이야기한 코드 중복 문제를 피할 수 있을 뿐 아니라 쿼리가 실제로 수행되기 직전에 완성된 표현식 트리를 생성하도록 코드를 구조화할 수 있다.

  6. 복잡한 쿼리에서 람다 표현식을 재사용하는 가장 효율적인 방법 중 하나는 닫힌 제네릭 타입에 대하여 쿼리를 위한 확장 메서드를 작성하는 것이다. (물론 작성시에는 Ienumerable<타입>을 매개변수로 취하는 메서드를 함께 작성해야 한다. 이는 LINQ TO SQL 과 LINQ TO Objects 모두를 지원한다.)

결론적으로

결론 : 쿼리를 작성할 때 람다 표현식을 본문으로 하는 조그만 빌딩 블록(작은 메서드)을 조합하여 완전한 쿼리를 작성할 수 있다. (마치 레고처럼. 이게 바로 객체지향 아닌가?) 또한 각각의 빌딩 블록은 IEnumerable 과 Iqueryable를 활용하면 장점을 더 극대화할 수 있다. 거기에다 이 방식을 채택하게되면 표현식 트리를 이용하여 쿼리를 수행하는 LINQ TO SQL에서도 올바르게 동작하는 재사용 가능한 빌딩 블록을 작성할 수 있다.