본문 바로가기
스터디

[오브젝트] 5장. 책임 할당하기

by eunoo 2023. 8. 12.

이 장에서는 책임 주도 설계를 해보며, 객체지향 설계에서 가장 중요한 적절한 객체에게 적절한 책임을 할당하는 것에 대해 배웠다.

책임 할당은 일종의 트레이드오프 활동이다. 즉, 책임을 할당하는데는 다양한 방법이 존재하며, 최선의 방법은 상황과 문맥에 따라 달라진다. GRASP 패턴은 적절한 책임을 할당하는 방법을 제시한다.

 

01 책임 주도 설계를 향해

앞서 4장에서 데이터 주도 설계에 대해 알아보았다. 데이터 주도 설계에서 책임 중심 설계로 전환하기 위해서는 다음의 두 원칙을 따라야 한다.

  • 데이터보다 행동을 먼저 결정하라.
  • 협력이라는 문맥 안에서 책임을 결정하라.

책임 주도 설계

1. 제공해야 하는 기능인 시스템 책임을 파악한다.

2. 그 책임을 더 작은 책임으로 분할한다.

3. 분할된 책임을 적절한 객체에게 할당한다.

4. 이 객체가 책임을 수행하는 도중 또 다른 책임이 필요하다면 그 책임에 적절한 객체를 찾아 할당한다.

5. 그렇게 두 객체가 협력하게 한다.

 

02 책임 할당을 위한 GRASP 패턴

GRASP(General Responsibility Assignment Software Pattern)이란, 일반적인 책임 할당을 위한 소프트웨어 패턴을 말하며, 객체에게 책임을 할당할 때 필요한 원칙을 정리한 것이다. GRASP 패턴에 대해 알아보며 객체에 어떻게 책임을 할당하는지 알아보자. 

다음은 책임 중심으로 설계하는 과정을 정리하였다.

 

1. 도메인 개념에서 출발하기

설계를 시작하기 위해 참고할 수 있는 개념들의 모음 정도로 간주하라. 도메인 개념을 정리하는데 너무 많은 시간을 쓸 필요없다. 올바른 도메인 모델이란 존재하지 않으며, 빠른 설계와 구현이 더 중요하다.

 

2. INFOMATION EXPERT(정보 전문가)에게 책임 할당하기

책임을 수행할 정보를 알고 있는 객체에게 책임을 할당한다. 이를 GRASP에서는 INFORMATION EXPERT 패턴이라고 부른다.

- 우선 시스템이 제공해야 하는 핵심 기능을 찾는다. ex) 영화를 예매하는 기능

- 이 책임을 수행하는데 필요한 메시지를 결정한다. ex) "예매하라"

- 이 메시지를 수신할 적합한 객체를 찾아 할당한다.

 

3. 높은 응집도(HIGH COHESHION)와 낮은 결합도(LOW COUPLING)

책임을 할당한 결과가 높은 응집도와 낮은 결합도를 고려했는지 파악한다.

객체의 의존성을 낮추고 변화의 영향을 줄이며, 재사용성을 증가시킨 설계인가?

 

4. 창조자에게 객체 생성 책임을 할당하라. (CREATOR 패턴)

영화 예매 협력의 최종 결과물은 Reservation 인스턴스를 생성하는 것이다. 어느 객체에게 Reservation 인스턴스를 생성할 책임을 할당해야 할까?

CREATOR패턴은 객체를 생성할 책임을 어떤 객체에게 할당할지에 대한 지침을 제공한다.

객체 A를 생성해야 할 때 다음과 같은 객체에게 객체 생성 책임을 할당하라.
- B가 A 객체를 포함하거나 참조한다.
- B가 A 객체를 기록한다.
- B가 A 객체를 긴밀하게 사용한다.
- B가 A 객체를 초기화하는데 필요한 데이터를 가지고 있다.(B는 A에 대한 정보 전문가이다.)

 

03 구현을 통한 검증

PROTECTED VARIATIONS(변경 보호) 패턴

변화가 예상되는 부분을 식별하고 그 주위에 안정된 인터페이스를 형성하도록 책임을 할당하라. 설계에서 변화는 것이 무엇인지 고려하고 변하는 개념을 캡슐화하라.

변경과 유연성

설계를 주도하는 것은 변경이다. 변경에 대비할 수 있는 두 가지 방법

1. 코드를 이해하고 수정하기 쉽도록 최대한 단순하게 설계한다.

2. 코드를 수정하지 않고도 변경을 수용할 수 있도록 코드를 유연하게 만들기

 

04 책임 주도 설계의 대안

책임을 어디에 둘지 결정하지 못하겠다면 일단 최대한 빠르게 실행되는 코드를 작성하는 것이 좋다. 그렇게 실행되는 코드를 얻고 난 후, 코드 상에 명확하게 드러난 책임을 올바른 위치로 이동시키는 리팩토링을 진행하면 된다!

 

메서드 응집도

객체로 책임을 분배할 때 가장 먼저 할 일은 메서드를 응집도 있는 수준으로 분해하는 것이다.

객체를 자율적으로 만들자

댓글