내일배움캠프 24일차 TIL : 더 느슨한 방법

김정환·2024년 10월 17일
0

키워드

  • 더 느슨한 방법

실습 시간 중 2개 이상의 책임을 갖게된 클래스를 SRP에 맞게 분리하는 과제가 있었다.
분리를 하는 것까진 좋은데 이제 분리한 클래스 간 관계를 맺어주다가 문득 의문이 들었다.

방법 1

내가 가장 많이 쓰던 방법이고 가장 쉽다고 생각하는 방법이다.
멤버 변수로 데이터에 접근할 클래스를 선언하고 Awake에서 캐싱한다.
그리고 쓰고 싶을 때 접근해서 쓰는 것이다.

public class ExampleClassA : MonoBehaviour
{
	private ExampleClassB classB;
    
    void Awake()
    {
    	classB = GetComponent<ExampleClassB>();
    }
    
    void Method1()
    {
    	classB.Method();
    }
}

방법 2

이번 강의를 통해서 배운 이벤트를 활용한 방법이다.
이벤트 변수를 선언하고 다른 클래스에서 이 이벤트에 구독하도록 하는 방법이다.

public class ExampleClassA : MonoBehaviour
{
    public event Action OnMethodCalled;
    
    void Method1()
    {
    	// 이벤트를 호출
    	OnMethodCalled?.Invoke();
    }
}


public class ExampleClassB : MonoBehaviour
{
    void Start()
    {
        classB = GetComponent<ExampleClassA>();
        classB.OnMethodCalled += Method;
    }
    
    void Method()
    {
    	// 메서드의 내용
    }
}

더 느슨한 방법

사용할 수 있는 방법이 늘어나다보니 어느 것이 더 좋은 방법인가 고민이 들었다.
객체지향에서 더 좋은 방법은 무엇인가 생각했고 강의에서 들은 것과 같이
객체 간의 더 느슨한 관계가 이루어진다면 좋을 것이라 생각했다.

방법 2에 대해서는 익힌지 얼마 안 되었기에 둘 중에 무엇이 더 느슨한 방법인지
오정호 튜터님께 문의드렸다.

결과적으로 방법 2 : 이벤트 방식이 더 느슨한 관계이다.

차이점

방법 1의 경우 :
ExampleClassA가 ExampleClassB의 Method를 호출하기 위해서
ExampleClassB를 변수로 선언해서 캐싱해두어야 하며, ExampleClassB의 Method의 이름을 알고 직접 호출해야한다.

방법 2의 경우 :
ExampleClassA는 ExampleClassB에게 접근하지 않아도 된다.
ExampleClassA는 OnMethodCalled를 원할 때 호출하면 된다.
ExampleClassB는 ExampleClassA에 접근하여 이벤트를 구독하는 것으로 클래스간 소통이 가능하다.

미묘하게 방법 2가 더 어려워보이지만 관계 자체는 더 느슨하다.

  • 방법 1에 비해 ExampleClassA는 ExampleClassB에 대해 많은 정보를 알 필요가 없다.
  • 방법 1은 ExampleClassA는 ExampleClassB에 의존하며 ExampleClassB는 ExampleClassA에 의해 사용된다는 관계가 성립한다.
    • 방법 1은 ExampleClassB가 없다면 ExampleClassA의 행위가 진행될 수 없는 관계이므로
      방법 2에 비해 상대적으로 더 강력한 관계인 것이다.
  • 방법 2에서는 ExampleClassA는 자기 자신에 지정된 행위만 수행하며 그에 따라 이벤트를 호출한다.
  • 방법 2에서 ExampleClassB는 실행 초기에 ExampleClassA의 이벤트를 구독한다.
    ExampleClassA의 이벤트가 실행되면 구독한 메서드가 실행되면 ExampleClassB의 역할을 수행할 수 있다.
    • 이 지점에서 ExampleClassB는 주체적으로 ExampleClassA를 구독하는 것으로 각 클래스는 독립적인 관계를 형성한다.

단점

단, 이벤트 방식에서도 단점은 존재하는데
만약 이벤트에 많은 구독이 있는 상황에서 이벤트 실행에 오류가 난다면
정확하게 어디서 오류가 났는지 알기 어렵다는 문제가 있다.

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글