본문 바로가기

Study/오프젝트

05) 책임 할당하기

 

1. 책임 주도 설계

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

1.1 데이터보다 행동을 먼저 결정하라

물론 나도 그렇듯 객체지향에 갓 입문한 사람들은 객체의 행동이 아니라 데이터에 초점을 맞추는 실수를 한다. 하지만 책임 중심의 설계에서는 객체가 수행해야 하는 책임이 무엇인지 결정한 후책임을 수행하는데 필요한 데이터는 무엇인지 결정한다. 다시 말해 책임 중심의 설계에서는 객체의 행동, 즉 책임을 먼저 결정한 후에 객체의 상태를 결정하는 것이다.

 

1.2 협력이라는 문맥 안에서 책임을 결정하라

책임객체의 입장이 아니라 객체가 참여하는 협력에 적합해야 한다. 이전에 메시지를 통해서 협력하는 것을 알아보았다. 이 메시지를 전송하는 전송자의 의도에 적합한 책임을 할당해야 한다. 즉 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다.

 

자동차 경주를 떠올려보자. 자동차 경주를 시작하기 위해서는 경주를 시작해라라는 메시지를 결정하고 그 다음 경주를 시작해라에 대한 정보 전문가를 찾아 이 메시지를 책임질 객체(Race)를 찾아 할당한다. 만약 Race객체가 자동차를 움직이는 역할을 수행을 하지 못할 경우 자동차를 움직여라는 메시지를 결정하고 이 메시지를 수행할 정보 전문가 객체(Car)에게 할당한다. 이 처럼 메시지클라이언트의 의도를 표현한다.

 

1.3 책임 주도 설계의 흐름

  • 시스템 책임을 파악한다
  • 책임을 더 작은 책임으로 분할한다
  • 분할된 책임을 수행할 수 있는 객체 또는 역할을 찾아 책임을 할당한다
  • 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 객체 또는 역할을 찾는다
  • 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 된다

 

2. GRASP Pattern(General Responsibility Assignment Software Patterns)

객체에게 책임을 할당할 때 지침으로 삼을 수 있는 원칙들의 집합을 패턴 형식으로 정리한 것

 

참고링크

https://nesoy.github.io/articles/2019-05/GRASP-Pattern

 

2.1 Information Expert

  • 책임을 정보 전문가. 즉, 책임을 수행하는 데 필요한 정보를 가지고 있는 객체에게 할당해라
  • 객체는 정보(상태)와 관련된 작업(행동)을 함께 가지는 단위

2.2 Low Coupling

  • 설계의 전체적인 결합도가 낮게 유지되도록 책임을 할당해라

2.3 High Coupling

  • 높은 응집도를 유지할 수 있게 책임을 할당해라

2.4 Creator

  • 객체 생성은 생성될 객체와 연결되거나 관련될 필요가 있는 객체에 해당 객체를 생성할 책임을 할당해라
  • 이미 존재하는 객체 사이의 관계를 이용하기 때문에 낮은 결합도를 유지할 수 있다
  • 아래 조건을 최대한 많이 만족하는 B에게 객체(A) 생성 책임을 할당해라 
    • B가 A 객체를 함하거나 참조한다.
    • B가 A 객체를 기록한다.
    • B가 A 객체를 밀접하게 사용한다.
    • B가 A 객체의 생성에 필요한 정보를 가지고 있다.

2.5 Polymorphism

  • 타입을 명시적으로 정의하고 각 타입에 다형적으로 행동하는 책임을 할당해라
  • 조건문을 사용하지 말고 다형성을 이용해 변화를 다루기 쉽게 확장해라

2.6 Protected Variations

  • 변화가 예상되는 불안정한 지점들을 식별하고 안정된 인터페이스를 형성하도록 책임을 할당해라

 

3. 응집도

응집도가 낮다는 것은 서로 연관성이 없는 기능이나 데이터가 하나의 클래스 안에 뭉쳐져 있는 것을 의미한다

낮은 응집도 문제를 해결하기 위해서는 변경의 이유에 따라 클래스를 분리해야 한다.

 

3.1 코드를 통해 변경의 이유를 파악하는 방법

3.1.1 인스턴스 변수가 초기화되는 시점

응집도가 높은 클래스인스턴스를 생성할 때 모든 속성을 함께 초기화한다.

반면 응집도가 낮은 클래스객체의 속성 중 일부만 초기화하고 일부는 초기화되지 않는 상태로 남는다.

따라서 함께 초기화되는 속성을 기준으로 코드를 분리해라

 

3.1.1 메서드들이 인스턴스 변수를 사용하는 방식

모든 메서드가 객체의 모든 속성을 사용하면 클래스의 응집도가 높다고 볼 수 있다.

반면 메서드들이 사용하는 속성에 따라 그룹이 나뉜다면 응집도가 낮다고 볼 수 있다.

속성 그룹과 해당 그룹에 접근하는 메서드 그룹을 기준으로 코드를 분리해라

 

 

3.2 클래스 응집도 판단하기

  • 클래스가 하나 이상의 이유로 변경돼야 한다면 응집도가 낮은 것이다.
  • 클래스의 인스턴스를 생성하는 시점에 모든 속성이 함께 초기화되지 않는다면 응집도가 낮은 것이다.
  • 메서드 그룹이 속성 그룹을 사용하는지 여부로 나뉜다면 응집도가 낮은 것이다.

'Study > 오프젝트' 카테고리의 다른 글

07) 객체 분해  (0) 2023.12.27
06) 메시지와 인터페이스  (0) 2023.12.15
04) 설계 품질과 트레이드오프  (1) 2023.12.07
03) 역할, 책임, 협력  (2) 2023.12.03
02) 객체지향 프로그래밍  (0) 2023.11.29