실습 시간 중 2개 이상의 책임을 갖게된 클래스를 SRP에 맞게 분리하는 과제가 있었다.
분리를 하는 것까진 좋은데 이제 분리한 클래스 간 관계를 맺어주다가 문득 의문이 들었다.
내가 가장 많이 쓰던 방법이고 가장 쉽다고 생각하는 방법이다.
멤버 변수로 데이터에 접근할 클래스를 선언하고 Awake에서 캐싱한다.
그리고 쓰고 싶을 때 접근해서 쓰는 것이다.
public class ExampleClassA : MonoBehaviour
{
private ExampleClassB classB;
void Awake()
{
classB = GetComponent<ExampleClassB>();
}
void Method1()
{
classB.Method();
}
}
이번 강의를 통해서 배운 이벤트를 활용한 방법이다.
이벤트 변수를 선언하고 다른 클래스에서 이 이벤트에 구독하도록 하는 방법이다.
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가 더 어려워보이지만 관계 자체는 더 느슨하다.
단, 이벤트 방식에서도 단점은 존재하는데
만약 이벤트에 많은 구독이 있는 상황에서 이벤트 실행에 오류가 난다면
정확하게 어디서 오류가 났는지 알기 어렵다는 문제가 있다.
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL