GRASP 패턴

2 minute read

GRASP Pattern

GRASP 은 객체지향에서 책임 할당을 위한 기법으로 Craig Larman 이라는 아저씨가 패턴형식으로 제안하였다.

GRASP는 General Responsibity Assignment Software Pattern 의 약자로 객체에게 책임을 할당할 때 지침으로 삼을수 있는 원칙에 대한 패턴이다.

도메인 개념에서 출발

첫 시작은 책임을 정의할 대상을 정의하는 과정으로 전체적인 도메인 개념 정의하는것 부터 시작한다. 이 때 도메인 개념을 정리하는데 너무 많은 시간을 들이지 말고 빠르게 설계와 구현을 진행하는 것이 좋다.

이 단계에서는 책임을 할당받을 객체들의 종류와 관계에 대한 정보를 알 수 있다면 충분하다.

GRASP에서 제시하는 Pattern

먼저 각 패턴에 대해 간략하게 알아본 후 각 패턴에 대한 상세 내용을 설명하겠다.

  • Information expert: 책임을 수행하는 데 필요한 정보를 가지고 있는 객체에게 할당
  • Low coupling: 객체간의 결합도가 낮은 방향으로 책임을 할당
  • High cohesion: 높은 응집도를 유지할 수 있는 방향으로 책임을 할당
  • Creator: 객체의 생성 책임을 생성되는 객체와 연결되거나, 관련될 필요가 있는 객체에게 맡기는 것
  • Polymorphism: 객체의 타입에 따라 변하는 로직일 있을때 if, switch, 등 논리 연사자를 이용하기 보다는 타입을 명시적으로 정의하고 각 타입에 다형적으로 행동하는 책임을 할당하라
  • Portected variations: 변경이 예상되는 지점은 인터페이스를 통해 책임을 할당하도록한다.

Information expert

객체의 협력 관계에서 메시지를 수신하는 객체는 클라이언트의 의도에 적합한 결과를 반환해야되는 책임이 있다. 이때 객체의 책임과 책임을 수행하는 데 필요한 상태는 동일한 객체 안에 존재해야한다. 책임을 수행하기 위한 정보는 자신이 갖고 있는게 자연스럽다.

예를 들어 가장 가까운 위치의 맥도날드에 빅맥버거 주문이라는 책임을 갖는 OrderService라는 객체가 있다고 하였을 때 빅맥을 주문하기 위해서는 위치정보와, 맥도날드 매장 전화번호라는 정보가 필요할 것이다. 이 때 OrderService객체가 주문하기 메시지를 전달 받을 경우 위치정보와 전화번호를 OrderService가 갖고 있는것이 자연스럽지 아니한가? 만약 위치정보와 전화번호를 매번 전달 받는다라면 클라이언트는 빅맥을 주문하기 메시지를 보내기위해 위치정보와 전화번호 책임을 갖는 객체와의 협력관계를 갖어야함으로 클라이언트의 불필요한 객체간의 결합이 발생하고 OrderService의 캡슐화는 낮아지는 현상이 발생할 것이다.

정보와 행동을 최대한 가까운 곳에 위치시킴으로서 캡슐화를 유지할 수 있다.

만약 객체 스스로 처리할 수 없는 메시지를 받았다면 다른 객체에게 메시지를 전달하여 필요한 정보를 받아야한다. 위의 예시와 같이 OrderServcie가 모든 매장의 전화번호를 갖고 있지만 현재 위치에 대한 정보를 알 수 없을 경우 현재 위치에 대한 정보를 갖는 객체에게 현재 위치 정보를 달라는 메시지를 전달할 수 도 있다.

객체 스스로 처리할 수 없는 작업이 있다면 다른 객체에게 메시지를 전달해야된다. 메시지를 전송하는 행위자체가 새로운 객체의 책임으로 할당되기 때문에 협력의 공동체를 구성할 수 있다.

Informantion expert 패턴은 가장 기본이 되는 객체지향의 원칙이다. 이 패턴을 따르는 것만으로도 자율성이 높은 객체들로 구성된 협력 공동체를 구축할 가능성이 높아진다.

Informantion expert 패턴은 객체란 상태와 행동을 함께 가지는 단위 원리를 책임 할당의 관점에서 표현

글이 너무 길어져서 다음에 Low Coupling, High cohesion에 대해 설명하겠다. 사실 별거 없다 그냥 낮은 결합도, 높은 응집도에 관련 이야기이다.

Updated: