티스토리 뷰
[Effective C# Item 32] Action, Predicate, Function과 순회 방식을 분리하라
weekyear 2020. 10. 20. 13:24이터레이터 메서드의 사용 예를 살피다 보면 크게 두 가지 유형이 있다. 시퀀스 내의 개별 항목을 이용하여 작업을 수행하는 유형 외에도, 시퀀스의 순회 방식에 변경을 주는 유형이 있다.
(예를 들어 특정 조건에 부합하는 항목만을 가져오거나, 매 N번째 항목만을 건너뛰며 가져오는 경우)
이처럼 순회 방식에 변경을 주는 유형은 어떤 유형의 업무라도 실제로 개별 항목에 대하여 수행해야 하는 작업의 내용과 시퀀스의 순회 방식은 서로 연관이 없으므로 분리하여 처리할 수 있다.
이 두 가지를 한 번에 수행하면 코드 간의 결합도가 높아지고 중복 코드가 발생하게 된다.
Action, Predicate, Function
익명 델리게이트를 사용할 때는 function과 action이라는 두 가지 패턴이 있고 function의 특별한 형태인 predicate가 있다.
predicate는 시퀀스 내의 항목이 조건에 부합하는지를 boolean으로 반환하는 function이다.
action 델리게이트는 컬렉션 내의 개별 요소에 대하여 실제 수행할 작업을 전달하기 위해 주로 사용된다.
예시 1) predicate의 사용 예 : List<T>.RemoveAll()
내부적으로 List<T>.RemoveAll()은 리스트 내의 각각의 요소를 델리게이트 메서드의 인자로 전달한다. 델리게이트가 true를 반환하면 해당 요소는 리스트에서 제거된다.
예시 2) action의 사용 예 : List<T>.ForEach()
action 메서드는 컬렉션의 모든 요소에 대하여 개별적으로 호출된다.
컬렉션 내의 모든 멤버를 콘솔에 출력하는 예다.
결론
이번 파트의 중요한 점은 1) 시퀀스를 순회하는 것과 2) 시퀀스의 개별 요소에 대해 작업을 수행하는 것을 구분해야 한다는 것이다. 익명 델리게이트나 람다 표현식을 이용하여 빌딩 블록을 작성해두면 다양한 방법으로 이를 재활용할 수 있다.
predicate를 포함한 function을 이용하면 시퀀스의 개별 요소에 대해 적용할 다양한 작업을 구현할 수 있다. action을 이용하면 시퀀스의 일부 요소를 가져와서 수행할 작업을 손쉽게 구현할 수 있다.
'Programming > Effective C#' 카테고리의 다른 글
[Effective C# Item 34] 함수를 매개변수로 사용하여 결합도를 낮추라 (0) | 2020.10.20 |
---|---|
[Effective C# Item 33] 필요한 시점에 필요한 요소를 생성하라 (0) | 2020.10.20 |
[Effective C# Item 30] 루프보다 쿼리 구문이 낫다 (0) | 2020.10.20 |
[Effective C# Item 29] 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다 (0) | 2020.10.18 |
[Effective C# Item 28] 확장 메서드를 이용하여 구체화된 제네릭 타입을 개선하라. (0) | 2020.10.18 |