[Unity] Delegate를 사용해 OCP문제 해결하기

문제 상황

namespace Delegate
{
    internal class FileName
    {
        public void ShowMenu()
        {
            int age = 0;

            // 전형적인 OCP를 위반하는 코드.
            // 나라가 추가될 때마다 else if 문이 추가됨.
            // 참고로 아래 if문 조건은 편의상 간단하게 적은 것임.
            if ("KOREA")
                age = GetAge_Korea();
            else
                age = GetAge_Japan();
        }

        private int GetAge_Korea()
        {
            return 0;
        }

        private int GetAge_Japan()
        {
            return 0;
        }
    }
}

 

 

해결법

위 코드에서 나라별 달라지는 부분은 나이 계산 함수 뿐이다.

그러면? 나이 계산 함수를 ShowMenu 밖으로 빼버린다.(= 나이 계산 함수를 파라미터로 받는다)

함수를 파라미터로 받기 위해서는 함수를 담는 변수가 필요하다.

-> 이게 바로 Delegate

 

namespace Delegate
{
    internal class FileName
    {
        public delegate int GetAgeDelegate();

        public void Test()
        {
            // 한국이면
            ShowMenu(GetAge_Korea);

            // 일본이면
            ShowMenu(GetAge_Japan);
            
            // 이곳에서 나라에 따라 ShowMenu가 적절히 호출되도록 로직 구현
        }

        public void ShowMenu(GetAgeDelegate getAgeDelegate)
        {
            int age = getAgeDelegate();
        }

        private int GetAge_Korea()
        {
            return 0;
        }

        private int GetAge_Japan()
        {
            return 0;
        }
    }
}

 

 

 

참고 영상

 

[C#]델리게이트의 모든 것(All about delegate) - YouTube