방프리

21.05.29Chapter4. LINQ 활용 (Item 34) 본문

C#/Effective C#

21.05.29Chapter4. LINQ 활용 (Item 34)

방프리 2021. 5. 29. 21:11

Item 34 : 함수를 매개변수로 사용하여 결합도를 낮추라

인터페이스를 정의하는 것보다는 델리게이트를 통해서 느슨한 결합을 만드는 것이 여러 방면에서 굉장히 좋다.

///<summary>
///인터페이스로 구현하였을 때
///</summary>
public interface IPredicate<T>
{
    bool Match(T soughtObject);
}

public class List<T>
{
    public void RemoveAll(IPredicate<T> match)
    {
    	//생략
    }
}

public class MyPredicate : IPredicate<int>
{
    public bool Match(int target) => 
    	target < 100;
}

///<summary>
///델리게이트로 구현하였을 때
///</summary>
public static IEnumerable<TResult> Zip<T1, T2 TResult>(
    IEnumerable<T1> first,
    IEnumerable<T2> second,
    Func<T1, T2, TResult> zipper)
{
    using (var firstSequence = first.GetEnumerator())
    {
        using (var secondSequence = second.GetEnumerator())
        {
            while (firstSequence.MoveNext() && secondSequence.MoveNext())
            {
            	yield return zipper(firstSequence.Current, secondSequence.Current);
            }
        }
    }
}

함수를 매개변수로 사용하면 알고리즘 자체와 알고리즘을 적용할 타입을 분리하는 데 도움이 된다. 범용적이기는 하나 

개발자 입장에서 코드를 이해하기가 어려울 수 있고, 유지보수나 런타임 시간에 오류가 발생할 수도 있다. 하지만 

정확한 타입을 안다는 가정하에 이 방법을 사용한다면, 굉장한 장점으로 다가올 것이다.

Comments