본문 바로가기

Study/Design Pattern

Unity의 SOLID

https://waterglass0105.tistory.com/38

 

[C++] OOP; Object-Oriented Programming

OOP; Object-Oriented Programming 설계 원칙 (SOLID) SRP; Single Responsibility Principle; 단일 책임의 원칙 모듈이 변경되는 이유는 한가지여야 하며, 오직 하나의 액터에 대해서만 책임을 져야한다. OCP; Open-Closed P

waterglass0105.tistory.com

 

SOLID 원칙을 다시금 복기해보면 다음과 같이 생각할 수 있다.

 

  • Single responsibility (단일책임원칙)
    클래스가 한 가지 작업만 수행한다. 즉, 변경할 이유는 하나만 있다.
  • Open-closed (개방폐쇄원칙)이미 작동하는 방식을 변경하지 않고도 클래스의 기능을 확장할 수 있어야 한다.
  • Liskov substitution (리스코프치환)하위 클래스는 기본 클래스를 대체할 수 있어야 한다. 즉, 기본 클래스의 방향성을 유지해야 한다.
  • Interface segregation (인터페이스분리원칙)인터페이스를 작게 유지해야한다. 클라이언트는 필요한 것만 구현한다.
  • Dependency inversion (의존역전원칙)추상화에 의존해야한다. 하나의 구체 클래스에서 다른 클래스로 직접 의존하면 안된다.

 

Unity 코드도 살펴보면 기본적으로 SOLID 원칙을 기반으로 작성되어 있는 것을 볼 수 있다.

유니티 UI의 대표적인 컴포넌트인 Button을 보면, Selectable이라는 클래스 하나와, IPointerClickHandler/ISubmitHandler 인터페이스를 상속받아서 사용하고있다.

 

이 Button 클래스가 SOLID 원칙을 어떻게 준수하고 있는지 살펴보자.

 

1. Single Responsibility Principle (단일 책임 원칙)

  • Selectable.cs: 이 클래스는 UI 요소의 선택 가능성을 관리하는 데 책임이 집중되어 있다. 선택 상태, 트랜지션, 상호작용 가능 여부 등 UI 선택 항목과 관련된 모든 작업이 이 클래스에서 처리된다.
  • Button.cs: 버튼 클릭 이벤트와 관련된 동작만 처리한다. Selectable에서 상속받아 버튼 고유의 기능(클릭 이벤트 처리, 제출 등)을 추가하면서도 자신의 책임을 벗어나지 않는다.
  • EventInterfaces.cs: 여러 이벤트 처리와 관련된 인터페이스를 정의하며, 각 인터페이스는 단일 이벤트 처리 동작(예: 클릭, 드래그, 스크롤 등)에만 초점을 맞춘다.

2. Open-Closed Principle (개방-폐쇄 원칙)

  • Selectable.cs: 열거형(예: Transition, SelectionState)과 가상 함수(예: OnEnable, OnDisable, FindSelectableOnLeft)를 사용해 동작을 확장할 수 있도록 설계되었다. 기본 클래스를 수정하지 않고도 하위 클래스에서 동작을 재정의하여 확장할 수 있다.
  • Button.cs: Selectable을 상속받아 기존의 선택 가능 동작에 클릭과 제출 이벤트를 추가했다. 기존 코드 수정 없이 기능을 확장했다.

3. Liskov Substitution Principle (리스코프 치환 원칙)

  • Button.cs는 Selectable을 상속하며, 기본 클래스의 모든 동작을 지원한다. Button 객체는 어디서든 Selectable로 대체 가능하며, 클릭 이벤트와 같은 추가 기능도 문제없이 동작한다.
  • IPointerDownHandler, IPointerUpHandler 등 이벤트 핸들러 인터페이스는 공통적인 이벤트 처리 동작을 정의하며, 이를 구현하는 클래스는 해당 동작을 확실히 제공한다.

4. Interface Segregation Principle (인터페이스 분리 원칙)

  • EventInterfaces.cs는 각 이벤트(예: OnPointerClick, OnDrag)에 대해 별도의 인터페이스를 정의했다. 필요한 이벤트만 구현할 수 있도록 인터페이스가 잘 분리되어 있다. 예를 들어, 버튼은 IPointerClickHandler와 ISubmitHandler를 구현하여 버튼의 동작에 적합한 기능만 제공한다.
  • 클래스는 모든 이벤트를 한 번에 처리하지 않고 필요한 인터페이스만 구현하므로, 불필요한 의존성을 피할 수 있다.

5. Dependency Inversion Principle (의존 역전 원칙)

  • Selectable 및 Button 클래스는 이벤트 시스템(예: EventSystem)과 상호작용할 때 추상화된 인터페이스(예: IPointerClickHandler, ISelectHandler)에 의존한다. 구체적인 구현이 아닌 인터페이스를 통해 의존성을 관리하므로, 다른 이벤트 시스템으로 교체하거나 확장하기 쉽다.
  • EventInterfaces.cs의 인터페이스들은 구현 세부사항을 숨기고, 이벤트 처리라는 공통된 추상화에 집중한다.

'Study > Design Pattern' 카테고리의 다른 글

MVC / MVVM 패턴  (0) 2025.01.18