반응형
람다 표현식을 사용하여 코드를 작성하면 동일한 코드를 반복하게 될 때가 있다.
// 20년 이상 근속자
var earlyFolks = from e in allEmployees
where e.Classification == EmployeeType.Salary
where e.YearsOfService >= 20
where e.MonthlySalary < 4000
select e;
// 20년 미만 근속자
var newest = from e in allEmployees
where e.Classification == EmployeeType.Salary
where e.YearsOfService < 20
where e.MonthlySalary < 4000
select e;
두 람다 식에서 중복되는 람다식을 메서드로 분리하기
private static bool LowPaidSalaried(Employee e) =>
e.MonthlySalary < 4000 && e.Classification ==
EmployeeType.Salary;
var earlyFolks = from e in allEmployees
where LowPaidSalaried(e) &&
e.YearsOfService >= 20
select e;
var earlyFolks = from e in allEmployees
where LowPaidSalaried(e) &&
e.YearsOfService < 20
select e;
조금 단순해진 것 같지만, 분리된 메서드는 재사용될 가능성이 낮다.
동일하게 사용되는 로직을 분리하여 호출 체인의 앞쪽으로 이동시켜보면 해결 될 것이다.
다음과 같이 재사용 가능한 빌딩 블록을 만들어 볼 수 있다.
private static IQueryable<Employee> LowPaidSalariedFilter
(this IQueryable<Employee> sequence) =>
from s in sequence
where s.Classification == EmployeeType.Salary &&
s.MonthlySalary < 4000
select s;
var salaried = allEmployees.LowPaidSalariedFilter();
var earlyFolks = salaried.Where(e => e.YearsOfService >= 20);
var newes = salaried.Where(e => e.YearsOfService < 20);
결론
재사용성을 위해 쿼리표현식과 람다가 관련된 경우에 한하여 빌딩 블록을 만들어 조합하는 것이 낫다.
반응형